在没有Windows.h的WIN32上编译

塞西尔

作为学习练习,我编写了一个标准Windows程序,该程序注册并创建一个窗口而没有显式包含Windows.hWindows.h提取了所有标头符号,并将其放置到自定义标头中,我将其包含到源代码中。自定义标头具有类似CreateWindow和的类型定义WNDCLASSEX

该程序cl.exe使用如下命令行编译

cl main.cpp /link opengl32.lib gdi32.lib kernel32.lib user32.lib

据我了解,这些.lib文件是导入库,它们可以进行设置工作,以便在进程启动时从关联的DLL加载函数地址。如果直接main.cpp包含上述命令行,则可以很好地工作Windows.h但是,cl.exe即使在命令行中指定了关联的导入库时,包含自定义标头时也无法将所有函数调用链接到Windows API中(未解决的外部符号错误)。

是否有某种特殊情况下的魔术cl.exe专门为表演Windows.h在这种情况下,需要什么步骤来确保正确的链接?

这是我可以构造的最小示例:

typedef unsigned __int64 UINT_PTR, *PUINT_PTR;
typedef __int64 LONG_PTR, *PLONG_PTR;
typedef UINT_PTR            WPARAM;
typedef LONG_PTR            LPARAM;
typedef LONG_PTR            LRESULT;
typedef int                 INT;
typedef unsigned int        UINT;
typedef char CHAR;
typedef unsigned short      WORD;
#define CONST const
#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name
DECLARE_HANDLE(HWND);
DECLARE_HANDLE(HINSTANCE);
DECLARE_HANDLE(HICON);
DECLARE_HANDLE(HCURSOR);
DECLARE_HANDLE(HBRUSH);
DECLARE_HANDLE(HMODULE);
typedef unsigned __int64 ULONG_PTR, *PULONG_PTR;
typedef CHAR *NPSTR, *LPSTR, *PSTR;
typedef CONST CHAR *LPCSTR, *PCSTR;
#define CALLBACK    __stdcall
#define WINAPI      __stdcall
typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM);
#define DECLSPEC_IMPORT __declspec(dllimport)
#define WINUSERAPI DECLSPEC_IMPORT
#define WINBASEAPI DECLSPEC_IMPORT
#define CS_VREDRAW          0x0001
#define CS_HREDRAW          0x0002
#define CS_OWNDC            0x0020
#define MAKEINTRESOURCEA(i) ((LPSTR)((ULONG_PTR)((WORD)(i))))
#define MAKEINTRESOURCE  MAKEINTRESOURCEA
#define IDC_ARROW           MAKEINTRESOURCE(32512)
#define NULL 0
typedef WORD                ATOM;   //BUGBUG - might want to remove this from minwin

typedef struct tagWNDCLASSEXA {
    UINT        cbSize;
    /* Win 3.x */
    UINT        style;
    WNDPROC     lpfnWndProc;
    int         cbClsExtra;
    int         cbWndExtra;
    HINSTANCE   hInstance;
    HICON       hIcon;
    HCURSOR     hCursor;
    HBRUSH      hbrBackground;
    LPCSTR      lpszMenuName;
    LPCSTR      lpszClassName;
    /* Win 4.0 */
    HICON       hIconSm;
} WNDCLASSEXA, *PWNDCLASSEXA, *NPWNDCLASSEXA, *LPWNDCLASSEXA;

WINUSERAPI LRESULT CALLBACK DefWindowProcA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
WINBASEAPI HMODULE WINAPI GetModuleHandleA(LPCSTR lpModuleName);
WINUSERAPI HCURSOR WINAPI LoadCursorA(HINSTANCE hInstance, LPCSTR lpCursorName);
WINUSERAPI ATOM WINAPI RegisterClassExA(CONST WNDCLASSEXA *);

LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
    return DefWindowProcA( hWnd, message, wParam, lParam );
}

INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, INT sw )
{
    // register window class
    WNDCLASSEXA wcex = { 0 };
    wcex.cbSize            = sizeof( WNDCLASSEXA );
    wcex.style            = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
    wcex.lpfnWndProc    = WndProc;
    wcex.hInstance        = (HINSTANCE)GetModuleHandleA( NULL );
    wcex.hIcon            = NULL;
    wcex.hCursor        = LoadCursorA( NULL, IDC_ARROW );
    wcex.lpszClassName    = "Title";
    RegisterClassExA( &wcex );

    return 0;
}

编译:

@echo off
call "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" x64

set CONSOLE= -subsystem:windows
set CFLAGS= -Zi -nologo
set CFLAGS= -D__WINDOWS__ -D_CRT_SECURE_NO_WARNINGS %CFLAGS%
set LFLAGS= -incremental:no -opt:ref
set LFLAGS= user32.lib kernel32.lib %LFLAGS%

cl %CFLAGS% main.cpp -Fegame.exe /link %LFLAGS% %CONSOLE%
杰里·科芬(Jerry Coffin)

不,这些工具没有任何作用,尤其是对于Windows.h。

我猜你把标题弄错了。很难看到没有标题就可能是什么问题,但是一种可能性仍然存在。

对于大多数功能,Windows同时具有“ ANSI”和“ Wide”两个版本,因此您看到CreateWindow的实际上是两个功能CreateWindowACreateWindowWCreateWindow仅以映射到*A*W名称的宏形式存在,具体取决于是否UNICODE定义。

因此,如果您为名为的函数提供了原型/声明CreateWindow,则不会链接-库中存在的CreateWindowAand和CreateWindowWnot CreateWindow

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Windows OS上的Python和Win32之间的IPC

来自分类Dev

Windows 10上的Win32支持

来自分类Dev

使MSBuild编译具有Win32和Win64平台依赖项的项目

来自分类Dev

为什么Win32没有僵尸线程问题?

来自分类Dev

没有Win32 API的本地帮助内容

来自分类Dev

为什么Win32没有僵尸线程问题?

来自分类Dev

Windows.h没有这样的文件或目录(在Linux上编译C代码)

来自分类Dev

Windows上的编译器错误,但Mac上没有

来自分类Dev

Windows XP上的Inno Setup安装程序显示“无效的Win32应用程序”

来自分类Dev

如何在Windows 7上删除Win32 / Sirefef.DT木马

来自分类Dev

Windows操作系统上的Python和Win32之间的IPC

来自分类Dev

在Windows Win32 vs amd64上构建hadoop

来自分类Dev

在通用 Windows 应用程序 C++ 上使用 win32 DLL 库

来自分类Dev

有没有一种方法可以将Windows 10 win32 / gdi ++ GUI程序的样式更改为Windows 95?

来自分类Dev

EXE不是有效的Win32应用程序,但在64位上运行

来自分类Dev

用Nuitka编译任何Python程序后,我得到“不是有效的win32应用程序”错误

来自分类Dev

Windows上没有Hadoop集群的MRUnit

来自分类Dev

没有TPM的Windows 8.1上的Bitlocker

来自分类Dev

我的Windows 10上没有Cortana

来自分类Dev

如何在Windows上为PHP7.0编译PECL扩展win32service

来自分类Dev

Golang:如何在没有cgo的情况下调用win32 API?

来自分类Dev

在没有控制台“静音”的情况下运行Win32程序

来自分类Dev

如何在没有cmd.exe的Win32控制台中打开程序?

来自分类Dev

如何使在没有 WS_VISIBLE 的情况下创建的 Win32 控件可见?

来自分类Dev

OSError:[WinError 193]%1不是有效的Win32应用程序错误,在Windows上通过Selenium和Python使用GeckoDriver和Firefox

来自分类Dev

有没有办法在Windows上运行LibreSSL?

来自分类Dev

有没有办法在Windows上运行LibreSSL?

来自分类Dev

为什么要基于_WIN32或__linux__有条件地包含direct.h或sys / stat.h?

来自分类Dev

Windows:如何拦截Win32磁盘I / O API

Related 相关文章

  1. 1

    Windows OS上的Python和Win32之间的IPC

  2. 2

    Windows 10上的Win32支持

  3. 3

    使MSBuild编译具有Win32和Win64平台依赖项的项目

  4. 4

    为什么Win32没有僵尸线程问题?

  5. 5

    没有Win32 API的本地帮助内容

  6. 6

    为什么Win32没有僵尸线程问题?

  7. 7

    Windows.h没有这样的文件或目录(在Linux上编译C代码)

  8. 8

    Windows上的编译器错误,但Mac上没有

  9. 9

    Windows XP上的Inno Setup安装程序显示“无效的Win32应用程序”

  10. 10

    如何在Windows 7上删除Win32 / Sirefef.DT木马

  11. 11

    Windows操作系统上的Python和Win32之间的IPC

  12. 12

    在Windows Win32 vs amd64上构建hadoop

  13. 13

    在通用 Windows 应用程序 C++ 上使用 win32 DLL 库

  14. 14

    有没有一种方法可以将Windows 10 win32 / gdi ++ GUI程序的样式更改为Windows 95?

  15. 15

    EXE不是有效的Win32应用程序,但在64位上运行

  16. 16

    用Nuitka编译任何Python程序后,我得到“不是有效的win32应用程序”错误

  17. 17

    Windows上没有Hadoop集群的MRUnit

  18. 18

    没有TPM的Windows 8.1上的Bitlocker

  19. 19

    我的Windows 10上没有Cortana

  20. 20

    如何在Windows上为PHP7.0编译PECL扩展win32service

  21. 21

    Golang:如何在没有cgo的情况下调用win32 API?

  22. 22

    在没有控制台“静音”的情况下运行Win32程序

  23. 23

    如何在没有cmd.exe的Win32控制台中打开程序?

  24. 24

    如何使在没有 WS_VISIBLE 的情况下创建的 Win32 控件可见?

  25. 25

    OSError:[WinError 193]%1不是有效的Win32应用程序错误,在Windows上通过Selenium和Python使用GeckoDriver和Firefox

  26. 26

    有没有办法在Windows上运行LibreSSL?

  27. 27

    有没有办法在Windows上运行LibreSSL?

  28. 28

    为什么要基于_WIN32或__linux__有条件地包含direct.h或sys / stat.h?

  29. 29

    Windows:如何拦截Win32磁盘I / O API

热门标签

归档