C++ VC++;6.0:实际参数太多

C++ VC++;6.0:实际参数太多,c++,parameters,compiler-errors,visual-c++-6,C++,Parameters,Compiler Errors,Visual C++ 6,我正在使用一个使用简单API的USB安全密钥。我所要做的就是包含他们的头文件并拨打电话。我有一个运行良好的示例C程序,基本上做到了这一点: 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; // e

我正在使用一个使用简单API的USB安全密钥。我所要做的就是包含他们的头文件并拨打电话。我有一个运行良好的示例C程序,基本上做到了这一点:

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=dongle()时发生的。我不明白为什么编译器会认为我的应用程序中有太多的参数,而不是示例应用程序中的参数。在C + C++中,我找到了一个使用GETPro()的区别,但是我不确定这是不是我在这里看到的问题,或者我如何在这个特定的场景中应用这个解决方案。

我需要知道的是如何在C++中编译这个C代码。

< p>需要使用一个更好的类型定义来定义<代码>软件> >代码>:< /p>
/* 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, ...);
/*我不知道SD_FIND是什么类型,假设是DWORD*/
typedef字(回调*DONGLEPTR)(双字,字*,双字*,双字*
,字*,字*,字*,字*,字*,字节*);

DONGLEPTR-dongle;/* 那篇文章正是你面临的问题。在C语言中,列表中没有参数的函数定义是一个可以接受任意数量参数的函数。这实际上意味着编译器不会检查传递给函数的参数的数量和类型。在C++中,编译器总是检查传递给函数的参数的数量和类型。因此,您需要为函数调用使用具有正确数量和类型的参数的typedef

比如:

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

VC 6?我强烈建议您将工具链更新为。。。嗯,还有其他的。当它工作时,你是编译成C,还是C++时编译?是的,我们实际上是在移动我们的平台(它依赖于几个没有正确地超出VC6的库)到一个现代环境的过程。@ ILDJARN:我在VC6中编译,但是工作代码包含在.c文件中,非工作代码包含在.CPP文件中,所以我相信。@ GEO:好了,你的代码显然是可编译的C,但不是可编译的C++。你的实际问题是什么?我尝试了这个,收到了一个额外的错误:错误C2440:“=”:无法从“无符号短(u stdcall*)(无符号短,无符号短*,无符号长*,无符号长*,无符号短*,无符号短*,无符号短*,无符号字符*)转换为“int(u stdcall*)(void)”,有趣的是,我在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);这个定义是否足够?当我添加这个typedef时,我收到了与shf301解决方案相同的错误:错误C2440:“=”:无法从“无符号短(u stdcall*)(无符号短、无符号短*、无符号长*、无符号长*、无符号短*、无符号短*、无符号短*、无符号短*、无符号短*、无符号字符*)转换为“int”(uu stdcall*)(void)“已更新,包括更改
加密狗的类型。成功了。非常感谢!