2012-06-07 8 views
1

간단한 API를 사용하는 USB 보안 키로 작업하고 있습니다. 내가해야 할 일은 헤더 파일을 포함하고 내 전화를하는 것뿐입니다. 나는 잘 작동하는 샘플 C 프로그램을 가지고 있으며, 거의 이것을 수행한다.VC++ 6.0 : 실제 매개 변수가 너무 많습니다.

HINSTANCE hDll; 
FARPROC dongle; 
WORD retcode, handle[16], SD_p1, SD_p2, SD_p3, SD_p4; 
DWORD lp1, lp2; 
BYTE buffer [1024]; 
SD_p1 = 0x1C76; // example password 1 
SD_p2 = 0x8078; // example password 2 
SD_p3 = 0; 
SD_p4 = 0; 

hDll = GetModuleHandle("dongle.dll"); 

if (hDll == NULL) 
{ 
    hDll = LoadLibrary("dongle.dll"); 
    if (hDll == NULL) 
    { 
     printf("Can't find dongle.dll\n"); 
     return; 
    } 
} 

dongle = GetProcAddress(hDll, "dongle"); 

retcode = dongle(SD_FIND, &handle[0], &lp1, &lp2, &SD_p1, &SD_p2, &SD_p3, &SD_p4, buffer); 

이렇게 모든 것이 잘 동작한다. 동글이 발견되고 나중에 동글 작업의 다른 기능을 호출합니다. 이것은 RETCODE = 동글에 무슨 일이 일어나고

error C2197: 'int (__stdcall *)(void)' : too many actual parameters 

() 호출 : 나는 C에 내가 보호하려는 ++ 응용 프로그램이 동일한 코드를 연결하면 그러나, 나는 다음과 같은 오류가 발생합니다. 나는 왜 컴파일러가 내 애플리케이션에는 너무 많은 매개 변수가 있지만 샘플 애플리케이션에는 없다고 생각하는지 이해하지 못한다. 나는 article GetProcAddress() C 대 C++에서이 방법을 사용하는 것의 차이점을 발견했는데, 이것이 내가 여기에서 보는 문제인지 또는이 특정 시나리오에서 그 솔루션을 어떻게 적용 할 것인지는 확실하지 않다. .

내가 알아야 할 것은이 C 코드를 어떻게 C++에서 컴파일 할 수 있는지입니다.

+4

VC 6? 나는 당신이 툴체인을 ... 정말로 잘 업데이트하도록 강력히 추천합니다. –

+0

작동 할 때 C로 컴파일하고 그렇지 않으면 C++로 컴파일합니까? – ildjarn

+0

예, 우리는 실제로 우리의 플랫폼 (VC6 이상으로 올바르게 작동하지 않는 여러 라이브러리에 의존하는)을 현대적인 환경으로 옮기는 과정에 있습니다. –

답변

2

당신은 dongle 더 나은 유형 정의를 사용해야합니다 : 문서는 발생한 문제가 정확히

/* I didn't know what type SD_FIND was, assumed DWORD */ 
typedef WORD (CALLBACK *DONGLEPTR)(DWORD,WORD*,DWORD*,DWORD* 
            ,WORD*,WORD*,WORD*,WORD*,BYTE*); 

DONGLEPTR dongle; /* <-- need to change this type as well */ 

/* ... */ 

dongle = (DONGLEPTR)GetProcAddress(hDll, "dongle"); 

/* ... */ 
retcode = dongle(SD_FIND, ...); 
+0

이 typedef를 추가 할 때 shf301의 솔루션과 동일한 오류가 발생했습니다. 오류 C2440 : '=': unsigned short (__stdcall *) (unsigned short, unsigned short *, unsigned long *, unsigned long * unsigned short *, unsigned short *, unsigned short *, unsigned char *) 'to'int (__stdcall *) (void) ' –

+0

'dongle'의 유형 변경을 포함하도록 업데이트되었습니다. – user7116

+0

그랬습니다. 매우 감사합니다! –

1

있다. C에서 매개 변수가없는 함수 정의는 여러 개의 매개 변수를 사용할 수있는 함수입니다. 이는 컴파일러가 함수에 전달하는 매개 변수의 수와 유형을 확인하지 않는다는 것을 의미합니다. C++에서 컴파일러는 함수에 전달 된 매개 변수의 수와 유형을 항상 확인합니다. 따라서 함수 호출을위한 올바른 숫자와 유형의 매개 변수를 가진 typedef를 사용해야합니다.

그래서 같은 :

typedef WORD (CALLBACK* DONGLEPROC)(DWORD, LPWORD, LPDWORD , LPDWORD , LPWORD, LPWORD, LPWORD, LPWORD, LPBYTE); 
+0

오류 C2440 : '=': '부호없는 short (__stdcall *) (unsigned short, unsigned short *, unsigned long *, unsigned long *, unsigned short *, unsigned short * , unsi gned short *, unsigned short *, unsigned char *) '에서'int (__stdcall *) (void) '로 변경 되었기 때문에 매개 변수가 없어야한다는 것을 알 수 있습니다. –

+0

흥미롭게도 API 헤더 파일에서 다음 줄을 발견했습니다 : EXTERN_C __declspec (dllexport) WORD WINAPI SecureDongle (WORD 함수, WORD * 핸들, DWORD * lp1, DWORD * lp2, WORD * SD_p1, WORD * SD_p2, WORD * SD_p3, WORD * SD_p4, BYTE * 버퍼); 이 정의로 충분하지 않아야합니까? –