2014-02-25 2 views
4

Dll 프로젝트를 만들었습니다.DLL에서 ASM 함수 내보내기 - Visual Studio C++

#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" 

임 내 테스트 :

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

내 heade 파일이 있습니다 : 나는 하나 개의 기능이 myasm.asm 파일을 생성 내가 그 DLL을 사용하고자하는 응용 프로그램과 내가 가지고있는 함수를 수출했다 :

#include "Lab1Dll.h" 

그러나 내 dll 내 MyProc1 함수를 내보내고 있지 않습니다. 해당 DLL에 "일반"기능을 추가하고 그것을 익스포트하면 내 테스트 응용 프로그램에서 사용할 수 있으며 DLL 컴파일 프로세스는 lib 파일을 생성합니다.

정상적인 기능이 없으면 .lib 파일을 가져 오지 않습니다. 그리고 그 도서관에 연결할 수 없습니다.

내 보낸 함수를 작동시키는 방법은 무엇입니까? 또는 처음에 어떻게 내보내는가?

업데이트 : 아래 contens와 함께 .def 파일을 추가하면 완벽하게 작동한다는 것을 알았습니다. 하지만. 나는 그것을해서는 안된다. 그게 __declspec (dllexport)이 나를 위해해야하는 것입니까?

LIBRARY 

EXPORTS 

MyProc1 
+0

데코 레이팅 된/맹 글링 된 이름과 관련이있을 수 있습니다. 'dumpbin'으로 확인하십시오. 'myasm.asm'에 데코 레이팅 된/맹 글링 된 이름을 가진 proc을 정의 해보십시오 (헤더 및 C 소스는 제외). 기타 제안 : http://stackoverflow.com/questions/2804893/c-dll-export-decorated-mangled-names –

+0

@ 루드 어떻게? 나는 그 "장식"에 대해 묻고 있습니다. – Hooch

답변

2

DLL에서 내 보낸 어셈블리 함수를 다른 모듈 (DLL/EXE)에서 사용하려고해도 비슷한 문제가있었습니다. 링커 오류에서 가져 오는 모듈이 예를 들어 __impl_SRFlushCacheSRFlushCache 대신 함수가 내보내기 모듈의 헤더 파일에서 선언되고 어셈블리 파일에 정의되어 있기 때문에 작동합니다. 그래서 무언가는 __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 파일을 만듭니다. 그런 다음 속성> 링커> 입력> 모듈 정의 파일 프로젝트로 이동합니다. 해당 특성에 name.def 파일을 추가하십시오. 그 때 수출해야합니다. (만약 내가했던 것처럼 누구나 프로젝트에 정의 파일을 추가하는 방법을 생각하면된다.) – douggard

관련 문제