VS编译错误:“到内置类型的函数样式转换只能接受一个参数”解决方案

调用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
}
感觉没啥用,这里只是传参数目不对而已。

你可能感兴趣的:(VS编译错误:“到内置类型的函数样式转换只能接受一个参数”解决方案)