Форум: "Прочее";
Текущий архив: 2011.10.09;
Скачать: [xml.tar.bz2];
ВнизYAR под windows Найти похожие ветки
← →
oxffff © (2011-06-09 16:49) [0]Приветствую.
Хочется поделиться радостью.
Теперь можно создавать окошки на YAR. :))))))
program myprogram;
uses api;
classname:pbyte;
Mwindow:HWND;
function WindowProc(wnd: HWND; msg: integer; wparam: WPARAM; lparam: LPARAM):LRESULT;
begin
result:=DefWindowProc(wnd,msg,wparam,lparam);
end;
procedure Doproc();
WNDCLASS:TWNDCLASSA;
ActualATOW:ATOW;
MSG:TMSG;
hinstance:HMODULE;
begin
getmem(classname,4);
classname[0]:=97;
classname[1]:=98;
classname[2]:=99;
classname[3]:=0;
hinstance:=GetModuleHandle(0);
FillMem(@WNDCLASS,sizeof(WNDCLASS),0);
WNDCLASS.hInstance:=hinstance;
WNDCLASS.lpfnWndProc:=WindowProc;
WNDCLASS.lpszClassName:=classname;
WNDCLASS.style:=3;
WNDCLASS.cbClsExtra:=0;
WNDCLASS.cbWndExtra:=0;
WNDCLASS.hIcon:= 0;
WNDCLASS.hCursor:=0;
WNDCLASS.hbrBackground:=16;
ActualATOW:=RegisterClass(WNDCLASS);
Mwindow := CreateWindowEx(0,classname,classname, 13565952,100,100,300,300,0,0,hinstance,0);
ShowWindow(Mwindow,5);
ShowWindow(Mwindow,5);
while true do
begin
GetMessage(MSG,0,0,0);
TranslateMessage (MSG);
DispatchMessage (MSG);
end;
end;
begin
Doproc();
end
P.S.
YAR также уже поддерживает перегрузку операторов в виде синтаксиса Free Pascal.
operator -(a:..;b:...):....
← →
* © (2011-06-09 17:19) [1]наблюдаю с интересом за развитием
вопрос появился
а зачем вот этот "program myprogram;" анахронизм?
← →
clickmaker © (2011-06-09 17:36) [2]> а зачем вот этот "program myprogram;"
наверно может быть еще library mylibrary; ?
← →
* © (2011-06-09 17:38) [3]
> наверно может быть еще library mylibrary; ?
так а почему это нельзя разрулить опциями проекта?
← →
oxffff © (2011-06-09 18:13) [4]За основу взят синтаксис Delphi.
Все меняется на лету. Например при трансляции на .NET
WNDCLASS.lpfnWndProc
раньше был указатель на функцию,а сейчас это полноценный делегат.
Это связано с более простым маршалингом по умолчанию.
Меня больше интересуют вопрос почему виснет
на
Mwindow := CreateWindowEx(0,classname,classname, 13565952,100,100,300,300,0,0,hinstance,0);
ShowWindow(Mwindow,5);
while true do
begin
GetMessage(MSG,0,0,0); <-
Но не виснет при
Mwindow := CreateWindowEx(0,classname,classname, 13565952,100,100,300,300,0,0,hinstance,0);
ShowWindow(Mwindow,5);
ShowWindow(Mwindow,5);
while true do
begin
GetMessage(MSG,0,0,0); <-
И тот и другой вариант реализации на Delphi 7.
Везде PEheader.subsystem=2;
Уже второй день ломаю голову. Так и не понятно.
Если кто может написать на C# и проверить как там также виснет?
← →
oxffff © (2011-06-09 18:14) [5]
> И тот и другой вариант реализации на Delphi 7.
не виснет на Delphi 7.
← →
* © (2011-06-09 18:21) [6]
> За основу взят синтаксис Delphi.
ну, совместимость - единственная причина, до которой я додумался
и то - эти два слова особо не повлияют при переносе проекта с делфи на YAR
я сейчас неспешно переношу проект с C++Builder на Qt - язык почти один, а переписывать приходится много
> Если кто может написать на C# и проверить как там также
> виснет?
нету шарпа, сорри
← →
oxffff © (2011-06-09 18:28) [7]
> * © (09.06.11 17:19) [1]
> наблюдаю с интересом за развитием
>
> вопрос появился
> а зачем вот этот "program myprogram;" анахронизм?
Было здорово, если бы люди высказали свое мнение по поводу синтаксиса современных Pascal подобных языков. Например Delphi, Free Pascal, Prism.
Что им нравится/не нравится, и что бы они хотели изменить в этих языках.
← →
Зритель (2011-06-09 18:45) [8]А разве там не бесконечный цикл? Вроде бы, надо так:
while GetMessage(MSG, 0, 0, 0) do
begin
TranslateMessage (MSG);
DispatchMessage (MSG);
end;
← →
oxffff © (2011-06-09 19:00) [9]
> Зритель (09.06.11 18:45) [8]
> А разве там не бесконечный цикл? Вроде бы, надо так:
>
> while GetMessage(MSG, 0, 0, 0) do
> begin
> TranslateMessage (MSG);
> DispatchMessage (MSG);
> end;
Это то да.
Также нужно еще и WM_QUIT.
← →
Зритель (2011-06-09 19:03) [10]
> oxffff © (09.06.11 19:00) [9]
По приходу WM_QUIT цикл сам прервется (GetMessage выдаст false).
← →
oxffff © (2011-06-09 19:03) [11]program myprogram;
uses api;
classname:pbyte;
Mwindow:HWND;
function WindowProc(wnd: HWND; msg: integer; wparam: WPARAM; lparam: LPARAM):LRESULT;
begin
if msg=2 then
begin
PostQuitMessage(0);
result:=0
end
else
begin
result:=DefWindowProc(wnd,msg,wparam,lparam);
end;
end;
procedure Doproc();
WNDCLASS:TWNDCLASSA;
ActualATOW:ATOW;
MSG:TMSG;
hinstance:HMODULE;
begin
getmem(classname,4);
classname[0]:=97;
classname[1]:=98;
classname[2]:=99;
classname[3]:=0;
hinstance:=GetModuleHandle(0);
FillMem(@WNDCLASS,sizeof(WNDCLASS),0);
WNDCLASS.hInstance:=hinstance;
WNDCLASS.lpfnWndProc:=WindowProc;
WNDCLASS.lpszClassName:=classname;
WNDCLASS.style:=3;
WNDCLASS.cbClsExtra:=0;
WNDCLASS.cbWndExtra:=0;
WNDCLASS.hIcon:= 0;
WNDCLASS.hCursor:=0;
WNDCLASS.hbrBackground:=16;
ActualATOW:=RegisterClass(WNDCLASS);
Mwindow := CreateWindowEx(0,classname,classname, 13565952,100,100,300,300,0,0,hinstance,0);
ShowWindow(Mwindow,5);
ShowWindow(Mwindow,5);
while GetMessage(MSG,0,0,0)<>0 do
begin
TranslateMessage (MSG);
DispatchMessage (MSG);
end;
end;
begin
Doproc();
end
:)
← →
Зритель (2011-06-09 19:06) [12]А если теперь убрать второе ShowWindow(Mwindow,5) - все равно виснет?
← →
oxffff © (2011-06-09 19:08) [13]Bool тип представлен как int32. Поэтому пока сравнение с целочисленными типами.
Напишу чуть позже обобщенный TRUE и FALSE.
По типу обобщенной функции c constraint.
TRUE<T:bool or boolean>():T;
begin
result:=TRUE_CONST;
end;
Кстати на самом деле Getmem в YAR имеет вид
Getmem<T:typed or untyped pointer>(var p:T;,..);
Поэтому вообще можно написать например Getmem<pointer>(p,..);
Но об этом знает только автор YAR. :)
← →
Зритель (2011-06-09 19:11) [14]
if msg = 2 then
begin
... // Здесь несколько операторов
end
else
begin
... // Здесь один оператор
end;
Выделенные жирным begin-end (в ветке else) действительно нужны? Это особенность синтаксиса, или их можно убрать, как в Паскале?
← →
oxffff © (2011-06-09 19:14) [15]
> Зритель (09.06.11 19:06) [12]
> А если теперь убрать второе ShowWindow(Mwindow,5) - все
> равно виснет?
Да. И мне совершенно непонятно почему. Я смотрел PE заголовок.
Отличие Delphi 7 и YAR->.NET в characteristics. Sub system и там и там WIN_GUI.
Вот весь код, который формируется.
.assembly extern mscorlib { auto }
.assembly project {}
.subsystem 2
.field public static int32 __heaphandle
.method public static pinvokeimpl("kernel32.dll" as "HeapCreate" winapi) int32 heapcreate(int32 flOptions,int32 dwInitialSize,int32 dwMaximumSize) cil managed preservesig
{
}
.method public static pinvokeimpl("kernel32.dll" as "HeapDestroy" winapi) bool heapdestroy(int32 handle) cil managed preservesig
{
}
.method public static pinvokeimpl("kernel32.dll" as "HeapAlloc" winapi) native int heapalloc(int32 handle,int32 dwFlags,int32 dwBytes) cil managed preservesig
{
}
.method public static pinvokeimpl("kernel32.dll" as "HeapFree" winapi) bool heapfree(int32 handle,int32 dwFlags,native int lpMem) cil managed preservesig
{
}
.method public static native int _getmem(int32 size) cil managed
{
ldsfld int32 __heaphandle
ldc.i4 0
ldarg size
call native int heapalloc(int32,int32,int32)
ret
}
.method public static void _freemem(native int pvalue) cil managed
{
ldsfld int32 __heaphandle
ldc.i4 0
ldarg pvalue
call bool heapfree(int32,int32,native int)
pop
ret
}
.typedef unsigned int8* as pbyte
.typedef int32 as BOOL
.typedef unsigned int32 as Thandle
.typedef unsigned int16 as ATOW
.typedef int32 as UINT
.typedef int32 as HINST
.typedef int32 as HMENU
.typedef int32 as HCURSOR
.typedef int32 as HBRUSH
.typedef char* as PWideChar
.typedef int32 as HICON
.typedef unsigned int32 as HWND
.typedef int32 as WPARAM
.typedef int32 as LPARAM
.typedef int32 as LRESULT
.typedef unsigned int32 as HMODULE
.class public sealed TFNWndProc extends [mscorlib]System.MulticastDelegate
{
.method public hidebysig specialname rtspecialname instance void .ctor(object MethodsClass, native int MethodPtr) runtime managed { }
.method public hidebysig virtual instance int32 Invoke(unsigned int32 wnd,int32 msg,int32 wparam,int32 lparam) runtime managed { }
}
.class public sealed TFNThreadStartRoutine extends [mscorlib]System.MulticastDelegate
{
.method public hidebysig specialname rtspecialname instance void .ctor(object MethodsClass, native int MethodPtr) runtime managed { }
.method public hidebysig virtual instance unsigned int32 Invoke(native int p) runtime managed { }
}
.class public sequential sealed TWNDCLASSA extends [mscorlib]System.ValueType
{
.field public int32 style
.field public class TFNWndProc lpfnWndProc
.field public int32 cbClsExtra
.field public int32 cbWndExtra
.field public int32 hInstance
.field public int32 hIcon
.field public int32 hCursor
.field public int32 hbrBackground
.field public unsigned int8* lpszMenuName
.field public unsigned int8* lpszClassName
}
.class public sequential sealed TPoint extends [mscorlib]System.ValueType
{
.field public int32 X
.field public int32 Y
}
.class public sequential sealed TMSG extends [mscorlib]System.ValueType
{
.field public unsigned int32 hwnd
.field public int32 message
.field public int32 wParam
.field public int32 lParam
}
.typedef valuetype TMSG* as PMSG
.method hidebysig public static pinvokeimpl("user32.dll" as "RegisterClassA" winapi)
unsigned int16 RegisterClass( valuetype TWNDCLASSA& wndclass) cil managed preservesig
{
}
.method hidebysig public static pinvokeimpl("kernel32.dll" as "GetCurrentProcess" winapi)
unsigned int32 GetCurrentProcess() cil managed preservesig
{
}
.method hidebysig public static pinvokeimpl("user32.dll" as "CreateWindowExA" winapi)
unsigned int32 CreateWindowEx(unsigned int32 dwExStyle,native int lpClassName,native int lpWindowName,unsigned int32 dwStyle,int32 X,int32 Y,int32 nWidth,int32 nHeight,unsigned int32 hWndParent,int32 hMenu,int32 hInstance,int32 lpParam) cil managed preservesig
{
}
.method hidebysig public static pinvokeimpl("kernel32.dll" as "GetLastError" winapi)
unsigned int32 GetLastError() cil managed preservesig
{
}
.method hidebysig public static pinvokeimpl("user32.dll" as "DefWindowProcA" winapi)
int32 DefWindowProc(unsigned int32 hWnd,int32 Msg,int32 wParam,int32 lParam) cil managed preservesig
{
}
.method hidebysig public static pinvokeimpl("user32.dll" as "ShowWindow" winapi)
int32 ShowWindow(unsigned int32 hWnd,int32 nCmdShow) cil managed preservesig
{
}
.method hidebysig public static pinvokeimpl("user32.dll" as "GetMessageA" winapi)
int32 GetMessage( valuetype TMSG& Msg,unsigned int32 hWnd,int32 wMsgFilterMin,int32 wMsgFilterMax) cil managed preservesig
{
}
.method hidebysig public static pinvokeimpl("user32.dll" as "TranslateMessage" winapi)
int32 TranslateMessage( valuetype TMSG& lpMsg) cil managed preservesig
{
}
.method hidebysig public static pinvokeimpl("user32.dll" as "DispatchMessageA" winapi)
int32 DispatchMessage( valuetype TMSG& lpMsg) cil managed preservesig
{
}
.method hidebysig public static pinvokeimpl("user32.dll" as "LoadIconA" winapi)
int32 LoadIcon(int32 hInstance,unsigned int32 lpIconName) cil managed preservesig
{
}
.method hidebysig public static pinvokeimpl("kernel32.dll" as "CreateThread" winapi)
unsigned int32 CreateThread(int32 lpThreadAttributes,unsigned int32 dwStackSize,class TFNThreadStartRoutine ThreadProc,unsigned int32 lpParameter,unsigned int32 dwCreationFlags,unsigned int32& lpThreadId) cil managed preservesig
{
}
.method hidebysig public static pinvokeimpl("kernel32.dll" as "Sleep" winapi)
void Sleep(unsigned int32 dwMilliseconds) cil managed preservesig
{
}
.method hidebysig public static pinvokeimpl("kernel32.dll" as "GetModuleHandleA" winapi)
unsigned int32 GetModuleHandle(unsigned int32 lpModuleName) cil managed preservesig
{
}
.method hidebysig public static pinvokeimpl("user32.dll" as "PostQuitMessage" winapi)
void PostQuitMessage(int32 code) cil managed preservesig
{
}
← →
oxffff © (2011-06-09 19:14) [16].field public static unsigned int8* classname
.field public static unsigned int32 Mwindow
.method public static int32 WindowProc(unsigned int32 wnd,int32 msg,int32 wparam,int32 lparam) cil managed
{
.maxstack 99
.locals init(int32 localvarresult)
ldarg msg
ldc.i4 2
ceq
brfalse Label1
ldc.i4 0
call void PostQuitMessage(int32 code)
ldc.i4 0
stloc localvarresult
br Label0
Label1:
ldarg wnd
ldarg msg
ldarg wparam
ldarg lparam
call int32 DefWindowProc(unsigned int32 hWnd,int32 Msg,int32 wParam,int32 lParam)
stloc localvarresult
Label0:
ldloc localvarresult
ret
}
.method public static void Doproc() cil managed
{
.maxstack 99
.locals init( valuetype TWNDCLASSA WNDCLASS,unsigned int16 ActualATOW, valuetype TMSG MSG,unsigned int32 hinstance)
ldsflda unsigned int8* classname
ldc.i4 4
call native int _getmem(int32)
stobj unsigned int8*
sizeof unsigned int8
ldc.i4 0
mul
ldsfld unsigned int8* classname
add
ldc.i4 97
stobj unsigned int8
sizeof unsigned int8
ldc.i4 1
mul
ldsfld unsigned int8* classname
add
ldc.i4 98
stobj unsigned int8
sizeof unsigned int8
ldc.i4 2
mul
ldsfld unsigned int8* classname
add
ldc.i4 99
stobj unsigned int8
sizeof unsigned int8
ldc.i4 3
mul
ldsfld unsigned int8* classname
add
ldc.i4 0
stobj unsigned int8
ldc.i4 0
call unsigned int32 GetModuleHandle(unsigned int32 lpModuleName)
stloc hinstance
ldloca WNDCLASS
ldc.i4 0
sizeof valuetype TWNDCLASSA
initblk
ldloca WNDCLASS
ldloc hinstance
stfld int32 TWNDCLASSA::hInstance
ldloca WNDCLASS
ldnull
ldftn int32 WindowProc(unsigned int32 wnd,int32 msg,int32 wparam,int32 lparam)
newobj instance void class TFNWndProc::.ctor(object,native int)
stfld class TFNWndProc TWNDCLASSA::lpfnWndProc
ldloca WNDCLASS
ldsfld unsigned int8* classname
stfld unsigned int8* TWNDCLASSA::lpszClassName
ldloca WNDCLASS
ldc.i4 3
stfld int32 TWNDCLASSA::style
ldloca WNDCLASS
ldc.i4 0
stfld int32 TWNDCLASSA::cbClsExtra
ldloca WNDCLASS
ldc.i4 0
stfld int32 TWNDCLASSA::cbWndExtra
ldloca WNDCLASS
ldc.i4 0
stfld int32 TWNDCLASSA::hIcon
ldloca WNDCLASS
ldc.i4 0
stfld int32 TWNDCLASSA::hCursor
ldloca WNDCLASS
ldc.i4 16
stfld int32 TWNDCLASSA::hbrBackground
ldloca WNDCLASS
call unsigned int16 RegisterClass( valuetype TWNDCLASSA& wndclass)
stloc ActualATOW
ldc.i4 0
ldsfld unsigned int8* classname
ldsfld unsigned int8* classname
ldc.i4 13565952
ldc.i4 100
ldc.i4 100
ldc.i4 300
ldc.i4 300
ldc.i4 0
ldc.i4 0
ldloc hinstance
ldc.i4 0
call unsigned int32 CreateWindowEx(unsigned int32 dwExStyle,native int lpClassName,native int lpWindowName,unsigned int32 dwStyle,int32 X,int32 Y,int32 nWidth,int32 nHeight,unsigned int32 hWndParent,int32 hMenu,int32 hInstance,int32 lpParam)
stsfld unsigned int32 Mwindow
ldsfld unsigned int32 Mwindow
ldc.i4 5
call int32 ShowWindow(unsigned int32 hWnd,int32 nCmdShow)
pop
ldsfld unsigned int32 Mwindow
ldc.i4 5
call int32 ShowWindow(unsigned int32 hWnd,int32 nCmdShow)
pop
Label0:
ldloca MSG
ldc.i4 0
ldc.i4 0
ldc.i4 0
call int32 GetMessage( valuetype TMSG& Msg,unsigned int32 hWnd,int32 wMsgFilterMin,int32 wMsgFilterMax)
ldc.i4 0
ceq
ldc.i4 0
ceq
brfalse Label1
ldloca MSG
call int32 TranslateMessage( valuetype TMSG& lpMsg)
pop
ldloca MSG
call int32 DispatchMessage( valuetype TMSG& lpMsg)
pop
br Label0
Label1:
ret
}
.method public static void main() cil managed
{
.maxstack 99
.entrypoint
ldc.i4 0
ldc.i4 10000000
ldc.i4 0
call int32 heapcreate(int32,int32,int32)
stsfld int32 __heaphandle
call void Doproc()
ldsfld int32 __heaphandle
call bool heapdestroy(int32)
pop
ret
}
← →
oxffff © (2011-06-09 19:15) [17]
> Зритель (09.06.11 19:11) [14]
>
> if msg = 2 then
> begin
> ... // Здесь несколько операторов
> end
> else
> begin
> ... // Здесь один оператор
> end;
>
> Выделенные жирным begin-end (в ветке else) действительно
> нужны? Это особенность синтаксиса, или их можно убрать,
> как в Паскале?
Можно убрать. Там по грамматике один STMT(statement)
← →
oxffff © (2011-06-09 19:45) [18]Да вопросов конечно появляется больше, чем ответов. :)
Например придется управляемые объекты делать pinned и делать на них ссылки при сохранении ссылок на них в неуправляемой куче.
Вообщем я помню об этом, и стараюсь писать на YAR аккуратно без ссылок в управляемую кучу из неуправляемой.
← →
oxffff © (2011-06-09 19:52) [19]
> oxffff © (09.06.11 19:45) [18]
Хотя не всегда получается. :)
← →
* © (2011-06-09 20:00) [20]
> Было здорово, если бы люди высказали свое мнение по поводу
> синтаксиса современных Pascal подобных языков. Например
> Delphi, Free Pascal, Prism.
в общем то в последних версиях делфи есть все что мне надо
только исполнение иногда хромает
сам я на делфи уже не пишу, жизнь заставила перейти на с++
← →
DiamondShark © (2011-06-09 20:19) [21]
> oxffff ©
А с ShowWindow(Mwindow,1) -- виснет?
← →
oxffff © (2011-06-09 20:25) [22]
> DiamondShark © (09.06.11 20:19) [21]
>
> > oxffff ©
>
> А с ShowWindow(Mwindow,1) -- виснет?
Виснет.
← →
DiamondShark © (2011-06-09 20:31) [23]Что возвращает ShowWindow в каждом вызове?
GetMessage что возвращает? Она может возвращать ноль, не ноль и -1.
Или она не возвращается?
← →
oxffff © (2011-06-09 20:45) [24]
> GetMessage что возвращает? Она может возвращать ноль, не
> ноль и -1.
> Или она не возвращается?
В том то и дело, что она не возвращается. Заходит, но не выходит.
Аналогичный native код на delphi работает с одним ShowWindow.
← →
oxffff © (2011-06-09 21:29) [25]Буду искать отличия у себя. Написал на С# (прошу не пинать).
там Все нормуль.
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace WindowsApplication14
{
static class Program
{
struct POINTAPI
{
public Int32 x;
public Int32 y;
};
struct MSG
{
public Int32 hwmd;
public Int32 message;
public Int32 wParam;
public Int32 lParam;
public Int32 time;
public POINTAPI pt;
} ;
public delegate IntPtr myWndProc(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);
[StructLayout(LayoutKind.Sequential)]
struct WNDCLASS
{
public uint style;
[MarshalAs(UnmanagedType.FunctionPtr)]
public myWndProc lpfnWndProc;
public int cbClsExtra;
public int cbWndExtra;
public IntPtr hInstance;
public IntPtr hIcon;
public IntPtr hCursor;
public IntPtr hbrBackground;
public string lpszMenuName;
public string lpszClassName;
}
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetMessage(out MSG lpMsg, IntPtr hWnd, uint wMsgFilterMin, uint wMsgFilterMax);
[DllImport("user32.dll")]
static extern ushort RegisterClass([In] ref WNDCLASS lpWndClass);
[DllImport("user32.dll")]
static extern IntPtr DefWindowProc(IntPtr hWnd, uint uMsg, IntPtr wParam, IntPtr lParam);
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr GetModuleHandle(string lpModuleName);
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow);
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr CreateWindowEx(
Int32 dwExStyle,
string lpClassName,
string lpWindowName,
Int32 dwStyle,
int x,
int y,
int nWidth,
int nHeight,
IntPtr hWndParent,
IntPtr hMenu,
IntPtr hInstance,
IntPtr lpParam);
public static IntPtr ActualWnd(IntPtr hWnd, uint uMsg, IntPtr wParam, IntPtr lParam)
{
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
[STAThread]
static void Main()
{
MSG lpMsg;
IntPtr a;
WNDCLASS wndclass;
UInt16 Atom;
IntPtr wndhandle;
wndclass = new WNDCLASS();
wndclass.hInstance = GetModuleHandle(null);
wndclass.lpfnWndProc = ActualWnd;
wndclass.lpszClassName = "abc";
wndclass.style = 3;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hIcon = (IntPtr)0;
wndclass.hCursor = (IntPtr)0;
wndclass.hbrBackground = (IntPtr)0;
Atom = RegisterClass(ref wndclass);
wndhandle = CreateWindowEx(0, "abc", "abc", 13565952, 100, 100, 300, 300, (IntPtr)0, (IntPtr)0, (IntPtr)0, (IntPtr)0);
ShowWindow(wndhandle, 5);
GetMessage(out lpMsg, (IntPtr)0, 0, 0);
}
}
}
← →
oxffff © (2011-06-09 21:53) [26]
> oxffff © (09.06.11 21:29) [25]
> Буду искать отличия у себя
Хм. Код формируется приемлемый.
Если запускать отдельно, то все нормуль.
А если запустить в моей среде, то увы.
Видимо перехват консольного вывода оказывает воздействие.
Я же до этого только консольными баловался приложениями.
А тут даже моя среда не выдержала прогресса. :))))))))))))))
← →
* © (2011-06-09 22:12) [27]
> oxffff © (09.06.11 21:53) [26]
а в паблике есть YAR?
я бы потестировал
← →
oxffff © (2011-06-09 22:22) [28]
> * © (09.06.11 22:12) [27]
Обязательно будет. Скорее даже будет возможность делать свои backend для других платформ(позже). Я выложу пример разработки для MSIL .NET.
Пока я исправляю баги и недоработки. Их еще достаточно :)
Они есть.
← →
* © (2011-06-09 22:25) [29]
> oxffff © (09.06.11 22:22) [28]
ок
интересно
жду
← →
oxffff © (2011-06-09 23:23) [30]Если кто будет использовать MSIL для развлечения необходимо заменить типы на
.class public sequential sealed TPoint extends [mscorlib]System.ValueType
{
.field public int32 X
.field public int32 Y
}
.class public sequential sealed TMSG extends [mscorlib]System.ValueType
{
.field public unsigned int32 hwnd
.field public int32 message
.field public int32 wParam
.field public int32 lParam
.field public int32 time
.field public valuetype TPoint point
}
← →
Дмитрий С © (2011-06-10 06:12) [31]Пожелания:
1. чтобы можно было переменные (константы, метки) определять в теле функции:
begin
...
var i:integer;
for i:=....
...
end;
2. Чтобы можно было писать несколько uses-ов в модуле.
3. Нормальный ifthen:
условие?<если да>:<если нет>;
4. Многострочные строки:
S := "qweqwe
qweqwe
qweqwe";
5. Константа-массив без объявления размерности:
const
Strs: array[] of string = ("zero", "one", "two"); // - компилятор как бы сам может посчитать:)
6. Что бы функции без результата автоматически считались процедурами, а не ошибку давали.
7. Чтобы можно было делегировать свойства (и, возможно, методы), например:
TFoo = class
private
FBar:TStringList;
public
property Count:Integer read FBar.Count; // не надо писать отдельный обработчик
end;
8. case для строк
9. break, continue с уровнем выхода, например:
for I := 0 to 100 do
for J := 0 to 100 do
begin
...
...
continue 2; // - next I
...
...
break 2; // - выход с обоих циклов
end;
Пока хватит? :)
← →
Дмитрий С © (2011-06-10 06:15) [32]
> Но не виснет при
У меня бывает под отладкой, пошагово, код работает как надо, а просто по F9 выдает AV, при этом привязки к таймеру и многопоточности нет.
← →
* © (2011-06-10 06:55) [33]
> 1. чтобы можно было переменные (константы, метки) определять
> в теле функции:
c++
> 2. Чтобы можно было писать несколько uses-ов в модуле.
не понял, что под этим подразумевается
> 3. Нормальный ifthen:
c++
> 4. Многострочные строки:
идея понятна, но есть проблем куча - как переносы строк обрабатывать?
в смысле, как их казать пользователю?
это одна из проблем
> 5. Константа-массив без объявления размерности:
php например
> 7. Чтобы можно было делегировать свойства (и, возможно,
> методы), например:
полезно!
> 8. case для строк
тот же php (польза сомнительна)
> continue 2; // - next I
бить будут
и в общем то не зря
← →
Дмитрий С © (2011-06-10 07:12) [34]
>
> не понял, что под этим подразумевается
например
unit SomeUnit;
interface
uses Windows, Sysutils, ...;
uses Unit1, Unit2;
type
TForm1 = class(TForm)
...
А к чему остальное то было?
← →
* © (2011-06-10 07:27) [35]
> uses Windows, Sysutils, ...;uses Unit1, Unit2;
а смысл?
или имеется ввиду инклюды ц++?
просто оно даже выглядит странно
> А к чему остальное то было?
это просто мои имхи на предложения
← →
oxffff © (2011-06-10 08:04) [36]
> Пока хватит? :)
>
>
Спасибо большое. Пожелания понятны.
Пункт 6?.
Вполне возможно писать method вместо
procedure и function, как в Prism.
← →
Дмитрий С © (2011-06-10 08:22) [37]
> а смысл?
Можно выделить группу общих модулей, выложить в common_units.inс, например. и использовать так:
unit Unit1;
interface
uses Windows, Forms, ....;
{$I common_units.inс}
← →
jack128_ (2011-06-10 08:24) [38]
> 3. Нормальный ifthen:
> условие?<если да>:<если нет>;
зачем, сделайте как в нормальных языках, что бы if then else был выражением, и не нужно будут отдельной оператор вводить.
> Скорее даже будет возможность делать свои backend для других
> платформ(позже).
бекэнд к LLVM не забудь -)
← →
* © (2011-06-10 08:25) [39]
> Дмитрий С © (10.06.11 08:22) [37]
это сахар
а инклюдов и сейчас можно пользовать не одним
← →
* © (2011-06-10 08:27) [40]
> бекэнд к LLVM не забудь -)
:-)
Страницы: 1 2 вся ветка
Форум: "Прочее";
Текущий архив: 2011.10.09;
Скачать: [xml.tar.bz2];
Память: 0.6 MB
Время: 0.004 c