// Get rID of the CRT and stuff; we don't need it#pragma comment(linker,"/Entry:mainCRTStartup")#pragma comment(linker,"/NoDefaultlib:msvcrt.lib")#pragma comment(linker,"/NoDefaultlib:kernel32.lib")#pragma comment(linker,"/NoDefaultlib:ntdll.lib")#pragma comment(linker,"/Subsystem:Console")#pragma comment(lib,"user32.lib")#include <windows.h>int mainCRTStartup(){ MSG msg; HWND hWndParent; WNDCLASS wndClass = { 0,&DefWindowProc,NulL,LoadCursor(NulL,IDC_ARROW),GetSyscolorBrush(color_3DFACE),TEXT("MyClass") }; RegisterClass(&wndClass); hWndParent = CreateWindow( wndClass.lpszClassname,WS_VISIBLE | WS_OVERLAPPEDWINDOW,33,100,NulL); CreateWindow(TEXT("button"),wndClass.lpszClassname,WS_VISIBLE | WS_CHILD | BS_GROUPBox,5,50,hWndParent,NulL); while (GetMessage(&msg,0) > 0) { TranslateMessage(&msg); dispatchMessage(&msg); } return 0;}
我明白了:
但是当我运行等效的D代码时:
// Again,get rID of the runtimepragma(startaddress,mainCRTStartup);pragma(lib,"dmd_win32.lib");import win32.windows;int mainCRTStartup(){ MSG msg; HWND hWndParent; WNDCLASS wndClass = { 0,"MyClass" }; RegisterClass(&wndClass); hWndParent = CreateWindow( wndClass.lpszClassname,NulL); CreateWindow("button",0) > 0) { TranslateMessage(&msg); dispatchMessage(&msg); } return 0;}
我明白了:
我很困惑……有什么可能导致这个白色背景?!
编辑:
我不确定它实际上是一个库BUG …我只是删除了依赖项(我没有看到代码有什么问题),但问题仍然存在:
version = Unicode;extern(windows):alias voID* HWND,HMENU,HINSTANCE,HCURSOR,HBrush,HICON;alias ushort ATOM,WORD;alias uint UINT,DWORD;alias int[2] POINT;alias int BOol;alias int LONG;alias size_t WParaM,LParaM,LRESulT;alias char* LPSTR;alias const(char)* LPCSTR;alias wchar* LPWSTR;alias const(wchar)* LPCWSTR;version(Unicode){ alias LPCWSTR LPCTSTR; alias LPWSTR LPTSTR; alias GetMessageW GetMessage; alias CreateWindowExW CreateWindowEx; alias dispatchMessageW dispatchMessage; alias DefWindowProcW DefWindowProc; alias LoadCursorW LoadCursor; alias RegisterClassW RegisterClass; alias WNDCLASSW WNDCLASS;}else{ alias LPCSTR LPCTSTR; alias LPSTR LPTSTR; alias GetMessageA GetMessage; alias CreateWindowExA CreateWindowEx; alias dispatchMessageA dispatchMessage; alias DefWindowProcA DefWindowProc; alias LoadCursorA LoadCursor; alias RegisterClassA RegisterClass; alias WNDCLASSA WNDCLASS;}LPCTSTR MAKEINTATOM(ATOM atom) { return cast(LPCTSTR)atom; }ATOM RegisterClassA(WNDCLASSA*);ATOM RegisterClassW(WNDCLASSW*);HCURSOR LoadCursorA(HINSTANCE,LPCSTR);HCURSOR LoadCursorW(HINSTANCE,LPCWSTR);LRESulT DefWindowProcA(HWND,UINT,WParaM,LParaM);LRESulT DefWindowProcW(HWND,LParaM);BOol GetMessageA(const(MSG)*,HWND,UINT);BOol GetMessageW(const(MSG)*,UINT);LONG dispatchMessageA(const(MSG)*);LONG dispatchMessageW(const(MSG)*);BOol TranslateMessage(const(MSG)*);HWND CreateWindowExA(int,LPCSTR,DWORD,int,voID*);HWND CreateWindowExW(int,LPCWSTR,voID*);HBrush GetSyscolorBrush(int);alias LRESulT function(HWND,LParaM) WNDPROC;enum{ NulL = null,color_3DFACE = 15,BS_GROUPBox = 7,}const LPCTSTR IDC_ARROW = cast(LPCTSTR)32512;struct MSG{ HWND hwnd; UINT message; WParaM wParam; LParaM lParam; DWORD time; POINT pt;}struct WNDCLASSA{ UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBrush hbrBackground; LPCSTR lpszMenuname; LPCSTR lpszClassname;}struct WNDCLASSW{ UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBrush hbrBackground; LPCWSTR lpszMenuname; LPCWSTR lpszClassname;}enum{ WS_OVERLAPPED = 0,WS_TILED = WS_OVERLAPPED,WS_MAXIMIZEBox = 0x00010000,WS_MINIMIZEBox = 0x00020000,WS_TABStop = 0x00010000,WS_GROUP = 0x00020000,WS_THICKFRAME = 0x00040000,WS_SIZEBox = WS_THICKFRAME,WS_SYSMENU = 0x00080000,WS_HSCRolL = 0x00100000,WS_VSCRolL = 0x00200000,WS_DLGFRAME = 0x00400000,WS_border = 0x00800000,WS_CAPTION = 0x00c00000,WS_OVERLAPPEDWINDOW = WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBox|WS_MAXIMIZEBox,WS_TILEDWINDOW = WS_OVERLAPPEDWINDOW,WS_MAXIMIZE = 0x01000000,WS_CliPCHILDREN = 0x02000000,WS_CliPSIBliNGS = 0x04000000,WS_Disabled = 0x08000000,WS_VISIBLE = 0x10000000,WS_MINIMIZE = 0x20000000,WS_ICONIC = WS_MINIMIZE,WS_CHILD = 0x40000000,WS_CHILDWINDOW = 0x40000000,WS_POPUP = 0x80000000,WS_POPUPWINDOW = WS_POPUP|WS_border|WS_SYSMENU,}pragma(startaddress,mainCRTStartup);int mainCRTStartup(){ MSG msg; HWND hWndParent; WNDCLASS wndClass = { 0,"MyClass" }; ATOM atom = RegisterClass(&wndClass); hWndParent = CreateWindowEx( 0,NulL); CreateWindowEx(0,"button",0) > 0) { TranslateMessage(&msg); dispatchMessage(&msg); } return 0;}
要么我做错了,要么是编译器错误……但即使它是编译器错误,我仍然不知道这样的事情会发生什么,因为它需要调用非常具体的API!想法?
解决方法 这是子系统版本问题(链接器责任).添加-L / SUBSYstem:CONSolE:4.0到dmd命令行来修复MyClass背景颜色. Walter喜欢旧系统,因此默认的OPTlink子系统版本为3.10.看起来像Microsoft的链接9.0使用5.0作为默认子系统版本. 总结以上是内存溢出为你收集整理的C和D中的相同_exact_代码给出不同的结果 – 为什么?全部内容,希望文章能够帮你解决C和D中的相同_exact_代码给出不同的结果 – 为什么?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)