调用DLL中的函数,按着基本的步骤来写的最后编译时,报错“到内置类型的函数样式转换只能接受一个参数”,网上搜了下,也没有看到有用的解决方案。
我的代码是这样的,调用LZMA的压缩函数,压缩文件:
HMODULE hModule = LoadLibrary(L"LZMA.dll"); if ( NULL == hModule ) { cout<<"没有找到LZMA.dll"<<endl; return 0; } LzmaCompress pLzmaCom = (LzmaCompress)GetProcAddress(hModule, "LzmaCompress"); if ( pLzmaCom ) { FILE* fp = fopen("c:\\1.jpg", "rb"); if ( NULL != fp ) { fseek(fp, 0, SEEK_END); size_t nSrcLen = ftell(fp); fseek(fp, 0, SEEK_SET); byte* pSrcData = (byte*)malloc(nSrcLen); fread(pSrcData, nSrcLen, 1, fp); fclose(fp); size_t nDesLen = nSrcLen; byte* pDesData = (byte*)malloc(nDesLen); byte prop[5] = {0}; size_t nPropSize = 5; int nRet = LzmaCompress(pDesData, &nDesLen, pSrcData, nSrcLen, prop, &nPropSize, \ 9, 1<<24, 3, 0, 2, 32, 2); if ( SZ_ERROR_OUTPUT_EOF == nRet ) {//申请内存不足 free(pDesData); nDesLen += nSrcLen; pDesData = (byte*)malloc(nDesLen); nRet = LzmaCompress(pDesData, &nDesLen, pSrcData, nSrcLen, prop, &nPropSize, \ 9, (1<<24), 3, 0, 2, 32, 2); } if ( SZ_OK == nRet ) {//压缩完成 fp = fopen("c:\\des_7z.dat", "wb+"); if ( NULL != fp ) { fwrite(pDesData, nDesLen, 1, fp); fclose(fp); } } free(pDesData); free(pSrcData); } } FreeLibrary(hModule);没有搜到解决方案就只能排查代码了,报错的代码行是:
int nRet = LzmaCompress(pDesData, &nDesLen, pSrcData, nSrcLen, prop, &nPropSize, 9, 1<<24, 3, 0, 2, 32, 2);
这里LzmaCompress只是一个自定义的函数指针类型,并不是实例指针。改成:
int nRet = pLzmaCom(pDesData, &nDesLen, pSrcData, nSrcLen, prop, &nPropSize, 9, 1<<24, 3, 0, 2, 32, 2);
问题解决,竟然这么简单,太大意了。如果你出现这种错误,检查代码,看看调用的是不是函数实例指针而非函数声明。
这种错误在MSDN上的说明是:
编译器错误 C2564 Visual Studio 2008 其他版本 更新:2007 年 11 月 错误消息 “type”: 到内置类型的函数样式转换只能接受一个参数 内置类型的函数样式类型转换采用单个参数。 下面的示例生成 C2564: // C2564.cpp void g(float f, double d) { int j = int(f, d); // C2564 }感觉没啥用,这里只是传参数目不对而已。