2012-06-07 15 views
1

Я работаю с ключом безопасности USB, который использует простой API. Все, что мне нужно сделать, это включить их заголовочный файл и сделать мои звонки. У меня есть пример программы на С, который отлично работает, и в значительной степени делает это: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); 

Итак, все в порядке. Найден ключ, а затем обращается к разным функциям и по работе с ключом. Тем не менее, когда я включаю это точно такой же код в C++ приложение, которое я хочу защитить, я получаю следующее сообщение об ошибке:

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

Это происходит на RETCODE = ключ) вызов (. Я не понимаю, почему компилятор полагает, что в моем приложении слишком много параметров, но не в образце приложения. Я нашел article, относящийся к разнице между использованием GetProcAddress() таким образом в 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 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: '=': невозможно преобразовать из 'unsigned short (__stdcall *) (unsigned short, unsigned short *, unsigned long *, unsigned long *, unsigned short *, unsigned short * , unsi gned short *, unsigned short *, unsigned char *) 'to' int (__stdcall *) (void) ', что заставляет меня поверить, что по какой-то причине по-прежнему видно, что параметров не должно быть. –

+0

Интересно, что я также нашел эту строку в файле заголовка API: EXTERN_C __declspec (dllexport) WORD WINAPI SecureDongle (функция WORD, WORD * handle, DWORD * lp1, DWORD * lp2, WORD * SD_p1, WORD * SD_p2, WORD * SD_p3, WORD * SD_p4, BYTE * buffer); Разве это определение недостаточно? –

Смежные вопросы