2014-04-03 4 views
1

DLL로 만들 기능이있는 .lib가 있습니다.DLL에서 함수를 내보낼 수 없습니다.

프로젝트 속성에서 나는 의 두 가지 작업을 수행했습니다. 1. C/C++ -> 일반 -> 추가 디렉토리 : .h 파일의 경로를 추가했습니다. 링커 -> 일반에서 2 -> 추가 Dependies는 :

그럼 내가 .H 파일

#ifndef _DFUWRAPPER_H_ 
#define _DFUWRAPPER_H_ 

#include <windows.h> 
#include "DFUEngine.h" 

#ifdef __cplusplus 
extern "C" { 
#endif 

__declspec(dllexport) void helloworld(void); 
__declspec(dllexport) void InitDLL(); 

#ifdef __cplusplus 
} 
#endif 

#endif 

을 만들어 .cpp 파일을 만든 lib 디렉토리 파일의 경로를 추가

#include "stdafx.h" 
#include "stdio.h" 
#include "DFUWrapper.h" 

#ifdef _MANAGED 
#pragma managed(push, off) 
#endif 

BOOL APIENTRY DllMain(HMODULE hModule, 
         DWORD ul_reason_for_call, 
         LPVOID lpReserved 
        ) 
{ 
    return TRUE; 
} 

#ifdef _MANAGED 
#pragma managed(pop) 
#endif 

void helloworld(void) 
{ 
    printf("hello world DFU"); 
} 

DFUEngine* PyDFUEngine() 
{ 
    return new DFUEngine(); 
} 

void delDFUEngine(DFUEngine *DFUe) 
{ 
    DFUe->~DFUEngine(); 
} 

void PyInitDLL(DFUEngine *DFUe) 
{ 
    return DFUe->InitDLL(); 
} 

필자는 helloword 함수를 사용하여 테스트를 수행했습니다. 이 함수는 DLL에서 볼 수 있지만 InitDLL 함수에서는 볼 수 없습니다. 어떻게이 문제를 해결할 수 있습니까? 사용하여 함수를 선언

+1

비주얼 스튜디오, 아마. 어떤 버전입니까? 그 기능을 "볼"수 없다는 것은 무엇을 의미합니까? 일부 데이터/오류/출력 표시. –

+0

VS2005를 사용 중입니다. 나는 의존성 워커를 조사하고있다. halloworld() 함수는 볼 수 있지만 InitDLL은 안됩니다. – user3484496

+1

.c 파일에서'PyInitDll'입니다. 당신의 .h는'InitDll'입니다. – agbinfo

답변

0

이 당신의 DLL 헤더 파일

#if defined (_MSC_VER) 
#if defined (MY_DLL_EXPORTS) 
#define MY_EXPORT __declspec(dllexport) 
#else 
#define MY_EXPORT __declspec(dllimport) 
#endif 
#else 
#define MY_EXPORT 
#endif 

을에 다음과 같은 정의를 도와주세요 그 매크로

#ifdef __cplusplus 
extern "C" { 
#endif 

MY_EXPORT void helloworld(void); 
MY_EXPORT void InitDLL(); 

#ifdef __cplusplus 
} 
#endif 

그리고 당신의 cpp를

MY_EXPORT void helloworld(void) 
{ 
    printf("hello world DFU"); 
} 

MY_EXPORT void InitDLL() 
{ 
    /// blahblah 
} 

에 사용하여 DLL을 컴파일

MY_DLL_EXPORT 정의 .... 하지만 IMPOR를 원할 때 정의하지 않아야합니다. T ....

0

DLL에서 내보내기 기능을 좋아합니다 using .DEF files.

이 갖는 네임 맹 글링을 회피하는 추가 이점 : C++ 복잡한 맹 글링 아니라 __stdcallextern "C"와 기능 (예컨대 [email protected])에서 일어나는 하나뿐.

당신은 단순히 당신의 DLL의 DEF 파일을 추가 할 수 있습니다, 예컨대 :

LIBRARY MYDLL 
EXPORTS 
    InitDLL  @1 
    helloworld @2 
    ... other functions ... 
관련 문제