2013-06-25 2 views
1

이 코드에서 나를 도울 수 있습니까?.dll 메서드를 사용하면

을 :

은 내가 아래의 코드에 따라 이러한 방법이 있지만 그 중 하나가 나에게 두통을 많이주고 ... 을 사용할 수 있습니다 ... 내 .DLL에 선언하는 방법을 사용하려면

main.h -> DLL

#ifndef _DLLTEST_H_ 
#define _DLLTEST_H_ 

#include <iostream> 
#include <stdio.h> 
#include <windows.h> 

extern "C" __declspec(dllexport) void NumberList(); 
extern "C" __declspec(dllexport) void LetterList(); 
extern "C" __declspec(dllexport) int sumNumber(int, int); 


#endif 

MAIN.CPP -> DLL

#include "main.h" 

#define MAXMODULE 50 

using namespace std; 

char module[MAXMODULE]; 


extern "C" __declspec(dllexport) 

void NumberList() { 

     GetModuleFileName(NULL, (LPTSTR)module, MAXMODULE); 

     cout << "\n\nThis function was called from " 
      << module 
      << endl << endl; 

     cout << "NumberList(): "; 


     for(int i=0; i<10; i++) { 

      cout << i << " "; 
     } 

     cout << endl << endl; 

} 



extern "C" __declspec(dllexport) 

void LetterList() { 

     GetModuleFileName(NULL, (LPTSTR)module, MAXMODULE); 

     cout << "\n\nThis function was called from " 
      << module 
      << endl << endl; 

     cout << "LetterList(): "; 


     for(int i=0; i<26; i++) { 

      cout << char(97 + i) << " "; 
     } 

     cout << endl << endl; 
} 


extern "C" __declspec(dllexport) 

int sumNumber(int i, int j) { 


    cout << "Number: " << i + j << endl; 

    return i+j; 
} 

테스트 내 .DLL

#define MAXMODULE 50 

using namespace std; 

typedef void (WINAPI*cfunc)(); 

cfunc NumberList; 
cfunc LetterList; 
cfunc sumNumber; 

int main() { 

     HINSTANCE hLib=LoadLibrary("libCriandoDLL.dll"); 


     if(hLib==NULL) { 

      cout << "Unable to load library!" << endl; 
      getch(); 
     } 

     char mod[MAXMODULE]; 

     GetModuleFileName((HMODULE)hLib, (LPTSTR)mod, MAXMODULE); 
     cout << "Library loaded: " << mod << endl; 


     NumberList=(cfunc)GetProcAddress((HMODULE)hLib, "NumberList"); 
     LetterList=(cfunc)GetProcAddress((HMODULE)hLib, "LetterList"); 
     sumNumber=(cfunc)GetProcAddress((HMODULE)hLib, "sumNumber"); 

     if((NumberList==NULL) || (LetterList==NULL) || (sumNumber==NULL)) { 

      cout << "Unable to load function(s)." << endl; 
      FreeLibrary((HMODULE)hLib); 
     } 


     NumberList(); 
     LetterList(); 
     sumNumber(1,1); 

     FreeLibrary((HMODULE)hLib); 

     getch(); 
} 

"NumberList();" 및 "LetterList();" 그러나 완벽하게 작동합니다 ... "sumNumber (1.1)"메서드를 사용하려고하면 다음과 같은 오류가 발생합니다. "함수에 인수가 너무 많습니다."

답변

2

가져온 함수를 모두 다음과 같이 선언하고 있습니다. 매개 변수를 고려하지 않고 반환 값을 제공하지 :

typedef void (WINAPI*cfunc)(); 

cfunc NumberList; 
cfunc LetterList; 
cfunc sumNumber; 

선언 sumNumber 올바르게 입력 int (WINAPI*)(int,int)이어야하고 당신은 괜찮을거야.

+0

실제로 DLL에서 선언되지 않기 때문에 'WINAPI'로 선언해서는 안됩니다. – Angew

+0

'WINAPI'는'WinDef.h'에서'__stdcall'로 정의되었습니다 - 이것은 컴파일러에게 C 스타일의 호출 규칙을 사용하는 데 필요한 편리한 축약입니다 - DLL에 대해 올바르게, extern에 의해 암시됩니다 C ""다른 쪽 끝에서. –

+0

'__stdcall'은 C와 C++ 함수가 기본적으로 사용하는'__cdecl'이 아닙니다. 'extern "C"''__stdcall'을 암시하는 참조가 있습니까? – Angew

관련 문제