从DLL导出ASM功能 - Visual Studio C ++

时间:2014-02-25 18:25:22

标签: c++ visual-studio assembly dll dllexport

我创建了Dll项目。 我创建了具有一个函数的myasm.asm文件:

 .486
.model flat, stdcall
.code
MyProc1 proc x: DWORD, y: DWORD
    xor eax,eax
//......//
    ret
MyProc1 endp
    end

有我的heade文件:

#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

3 个答案:

答案 0 :(得分:2)

当尝试从另一个模块(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

答案 1 :(得分:1)

相当于__declspec(dllexport)的混乱状态是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

确保名称处理匹配

答案 2 :(得分:0)

  

有四种导出定义的方法,列于   推荐的使用顺序:

     
      源代码中的
  • __ declspec(dllexport)

  •   
  • .def文件中的EXPORTS语句

  •   
  • LINK命令中的/ EXPORT规范

  •   
  • 源代码中的注释指令,格式为#pragma comment(linker,“ / export:definition”)。

  •   

来源

来源