加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C和D中的相同_exact_代码给出不同的结果 – 为什么?

发布时间:2020-12-16 10:22:11 所属栏目:百科 来源:网络整理
导读:当我运行这个C代码时: // 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(lin
当我运行这个C代码时:

// 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 runtime
pragma(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作为默认子系统版本.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读