从 DLL 导出 ASM 函数 - Visual Studio C++

Exporting ASM function from DLL - Visual Studio C++

本文关键字:Visual Studio C++ 函数 DLL 导出 ASM      更新时间:2023-10-16

>我创建了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