2014-02-25 131 views
4

我已经创建了Dll项目。 我创建了一个有一个函数myasm.asm文件:从DLL导出ASM函数 - Visual Studio C++

.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的(它beging)”

#define LAB1DLL_EXPORTS 1 
#include "Lab1Dll.h" 

林我的测试应用程序,我想要使用该DLL,它的导出功能我有:

#include "Lab1Dll.h" 

但我的DLL不导出MyProc1函数。如果我向该DLL添加“正常”函数并将其exprot,那么它在我的Test应用程序中可用,并且DLL编译过程生成lib文件。

没有“正常”功能我没有得到.lib文件。我无法链接到该库。

如何使导出的函数有效?或者如何使它首先出口?

更新: 我看到用下面的contens添加.def文件是完美的。但是之后。我不应该这样做。那是__declspec(dllexport)应该为我做些什么?

LIBRARY 

EXPORTS 

MyProc1 
+0

可能与装饰/ mangled名称有关;用'dumpbin'检查。尝试在'myasm.asm'中定义具有装饰/损坏名称的proc(但不包括头文件和C源代码)。其他建议:http://stackoverflow.com/questions/2804893/c-dll-export-decorated-mangled-names –

+0

@Ruud如何?我在问这个“装饰”。 – Hooch

回答

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 
+0

在Visual Studio中,首先使用您的项目中的定义创建一个name.def文件。然后进入项目Properties> Linker> Input> Module Definition File。将name.def文件添加到该属性。它应该导出。 (如果有人遇到如何将定义文件添加到项目中,就像我一样)。 – douggard