我创建了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并对其进行exprot,它在我的Test应用程序中可用,并且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是在EXPORT
之后的proc
因此,这会将.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文件中的EXPORTS语句
- LINK命令中的/ EXPORT规范
- 源代码中的注释指令,形式为#pragma comment(linker,“/ export:definition”)。
资源
起源