>我创建了Dll项目。我创建了一个具有一个功能的myasm.asm文件:
.486
.model flat, stdcall
.code
MyProc1 proc x: DWORD, y: DWORD
xor eax,eax
//......//
ret
MyProc1 endp
end
有我的标题文件:
#pragma once
#include <Windows.h>
#ifdef LAB1DLL_EXPORTS
#define LAB1DLL_API __declspec(dllexport)
#else
#define LAB1DLL_API __declspec(dllimport)
#endif
extern "C"
{
LAB1DLL_API int _stdcall MyProc1(DWORD x, DWORD y);
}
和dllMain(乞求它)"
#define LAB1DLL_EXPORTS 1
#include "Lab1Dll.h"
我是我的测试应用程序,我想使用该 dll,它是我拥有的导出功能:
#include "Lab1Dll.h"
但是我的dll没有导出我的MyProc1函数。如果我向该 DLL 添加"普通"函数并对其进行扩展,则在我的测试应用程序中可以使用它,并且 DLL 编译过程会产生 lib 文件。
没有"正常"功能,我不会得到.lib文件。而且我无法链接到该库。
如何使导出的函数工作?或者首先如何使其出口?
更新:我看到添加带有以下内容的 .def 文件非常完美。但是。我不应该这样做。这就是__declspec(dllexport)应该为我做的吗?
LIBRARY
EXPORTS
MyProc1
尝试从另一个模块 (DLL/EXE) 使用从 DLL 导出的程序集函数时,我遇到了类似的问题。从链接器错误中,我发现导入模块正在尝试访问例如 __impl_SRFlushCache
函数,而不是SRFlushCache
函数,因为它在导出模块的头文件中声明并在程序集文件中定义。所以有些东西__impl_
前缀中添加了,但我将函数声明为 extern "C"
以避免任何混乱。
我通过将模块定义 (.def) 文件添加到导出模块并在那里列出我的程序集函数来解决问题,如下所示:
LIBRARY SRPlatform
EXPORTS
SRFlushCache
供参考:
头文件中的函数声明:
#ifdef SRPLATFORM_EXPORTS
#define SRPLATFORM_API __declspec(dllexport)
#else
#define SRPLATFORM_API __declspec(dllimport)
#endif // SRPLATFORM_EXPORTS
SRPLATFORM_API void __fastcall SRFlushCache(const void *pFirstCl, const void *pLimCl, const size_t clSize);
.asm 文件中的函数定义:
_DATA SEGMENT
_DATA ENDS
_TEXT SEGMENT
PUBLIC SRFlushCache
; RCX=pFirstCl
; RDX=pLimCl
; R8=clSize
SRFlushCache PROC
SRFlushCache_Loop:
clflushopt byte ptr [RCX]
add RCX, R8
cmp RCX, RDX ; RCX-RDX
jl SRFlushCache_Loop
ret
SRFlushCache ENDP
_TEXT ENDS
END
相当于 __declspec(dllexport)
的 masm 在 proc
之后EXPORT
因此,这会将 .drectve 部分添加到 masm 生成的 *.obj 文件中,并由链接器处理
.386
.model flat, stdcall
.code
MyProc1 proc EXPORT x: DWORD, y: DWORD
xor eax,eax
ret
MyProc1 endp
end
此外,如果您在头文件中将MyProc1
声明为 extern "C"
,则
MyProc1 proc C EXPORT x: DWORD, y: DWORD
否则就是
MyProc1 proc stdcall EXPORT x: DWORD, y: DWORD
确保名称重整匹配
导出定义有四种方法,列在 推荐使用顺序:
源代码中的__declspec(dllexport)
.def 文件中的导出语句
链接命令中的/EXPORT 规范
源代码中的注释指令,形式为 #pragma 注释(链接器,"/导出:定义")。
源
- https://learn.microsoft.com/en-us/cpp/build/reference/export-exports-a-function?view=vs-2017
起源
- http://masm32.com/board/index.php?topic=5150.0