繁体   English   中英

如何以user32.dll(aka stdcall?)方式声明DLL?

[英]How to declare DLL in user32.dll (aka stdcall?) fashion?

我有一个第三方应用程序,允许您从DLL文件调用C函数。 此应用程序提供的示例显示您可以从user32.dll调用MessageBoxW。 它还允许您从DLL文件中调用C函数。

我已经从file.h文件中得到了一个DLL,如下所示:

_declspec (dllexport) void example(int);

和file.c像这样:

#include <stdio.h>
#include "file.h"

_declspec (dllexport) void example(int s1)
{
    printf("dsa");    
}

并使用Windows SDK中的C / C ++编译器版本15进行编译,如下所示:

cl file.c /DLL /LD

而且我可以使用DLL文件进行正确的编译。 在DLL函数检查器中,我看到了我的函数。 我将此文件放到System32文件夹中,然后从该第三方应用程序中调用它。

应用程序找到文件,但是找不到该功能。

我认为问题的原因在于,我以Windows库(如user32.dll)的其他方式/方式/标准声明(或编译)了我的DLL,因为user32.dll可以正常工作。

我发现第三方应用程序在DLL中使用了这种调用函数:

winapi_abi用于调用Windows系统函数。 在Windows上将它们声明为stdcall,但没有错误的名称。

所以我的问题是:如何以user32.dll方式(stdcall?)准备和编译DLL文件,以便它可以与第三方应用程序一起使用?

简单的答案是:

__declspec(dllexport) void __stdcall example(int);

当然,在实现上也是如此。

如果您查看windows.h和朋友,您将看到:

#define WINUSERAPI __declspec(dllexport)
#define WINAPI __stdcall

接着:

WINUSERAPI int WINAPI MessageBoxW(HWND,LPCWSTR,LPCWSTR,UINT);

但是,如果仅定义一些函数,则不需要宏。

包括一个.def文件以击败stdcall名称修饰。 然后,您可以摆脱__declspec(dllexport)的混乱情况。

您没有在函数声明中指定任何调用约定,因此编译器将默认为__cdecl ,它装饰导出的名称。 另外,如果您使用C ++而不是C进行编译,则还会发生其他修饰。 您需要在代码中执行类似以下的操作来解决所有这些问题:

file.h:

#ifndef fileH
#define fileH

#ifdef _BUILDING_DLL_
#define MYEXPORT __declspec (dllexport)
#else
#define MYEXPORT __declspec (dllimport)
#endif

#ifdef __cplusplus
extern "C" {
#endif

MYEXPORT void __stdcall example(int);

#ifdef __cplusplus
}
#endif

#endif

file.c:

#include <stdio.h>

#define _BUILDING_DLL_
#include "file.h"

void __stdcall example(int s1)
{
   printf("dsa");
}

谢谢你们。 解决方案是添加带有导出的def文件,通过/DEF:file.def将其包含在编译器中,使用Remy版本(不带#define _BUILDING ...)并删除_stdcall。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM