2014-02-25 162 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