【发布时间】:2022-06-11 17:07:07
【问题描述】:
头文件如下所示
#define CoverWinAPI extern "C" __declspec(dllexport)
CoverWinAPI BOOL RunDll();
CoverWinAPI void ReplaceIATEntryInOneMod(PCSTR pszCalleeModName,PROC pfnCurrent,PROC pfnNew,HMODULE hmodCaller);
#pragma comment(linker,"/export:MyCreateWindowExW=_MyCreateWindowExW@48")
CoverWinAPI HWND WINAPI MyCreateWindowExW(
_In_opt_ DWORD dwExStyle,
_In_opt_ LPCWSTR lpClassName,
_In_opt_ LPCWSTR lpWindowName,
_In_ DWORD dwStyle,
_In_ int X,
_In_ int Y,
_In_ int nWidth,
_In_ int nHeight,
_In_opt_ HWND hWndParent,
_In_opt_ HMENU hMenu,
_In_opt_ HINSTANCE hInstance,
_In_opt_ LPVOID lpParam);
当我不使用#pragma 注释时,导出函数名称为_MyCreateWindowExW@48。
但是当我使用 #pragma comment(linker,"/export:MyCreateWindowExW=_MyCreateWindowExW@48") 时,MSVC 编译失败并显示 unresolved external symbol _MyCreateWindowExW@48。是什么导致了这个错误?
【问题讨论】:
-
你(也)在
MyCreateWindowExW函数的实际定义之前有那个#pragma comment()指令吗?不知道为什么会有所不同,但M/S docs 中给出的示例是(明显?)在BOOL CALLBACK PlainFuncName( Things * lpParams)之后缺少分号。 -
@AdrianMole 我尝试将相同的代码添加到 cpp ,但不起作用。
-
构建此 DLL 的 x64 风格将失败并出现此链接器错误,它不会使用 stdcall 装饰。用#ifndef _WIN64 包裹#pragma 以避免。
-
@HansPassant 我认为我使用 x32 编译并尝试在我的代码中运行
#ifndef _WIN64 std::cout<<"Hello 32"<<std::endl; #endif。它实际上输出“Hello 32”。 -
WINAPI是否扩展为__stdcall?
标签: c++ c winapi visual-c++