VS编译版本设置, 无法定位程序输入点...及无法定位序数...

  vs2010会自动生成一个targetver.h文件,这个文件只有一个语句:
  #include <SDKDDKVer.h>
该文件中有这样一个定义: #define _WIN32_WINNT 0x0601
0x0601指的windows7.这个语句的意思是指编译程序时,使用windows 7版本系统头文件,可以理解为windows 7支持的API,结构等等都可以使用.但这样做也会产生一个问题,那就是低于win7版本的系统为本会支持win7定义的一些结构(或者其成员),API,或枚举类型(或其成员)等等.

  在这种情况下,不能为了支持版本的系统而修改_WIN32_WINNT的定义,例如: #define _WIN32_WINNT 0x0501,这个定义会导致VS只编译windowsxp支持的结构,API等等,如果程序中使用了win7支持API,结构等等,会发现编译错误.因为程序只能向下兼容,不能向上兼容.

  正确的做法是在程序中修改代码,如果是windows7中定义的函数而没有在winxp中定义,则使用函数指针,否则,将可能发生"无法定位程序输入点xxx于动态链接库xxx.dll上"类似错误.例如下面的调用:

GetProductInfo(osvi.dwMajorVersion, osvi.dwMinorVersion, 0, 0, &dwType);

这个函数是在win7中定义,在winxp系统中运行程序(编译时_WIN32_WINNT定义为0x0601),则会发生弹出一个对话框提示错误: "无法定位程序输入点Getproductinfo于动态链接库kernel32.dll上".并且,这个对话框是在执行到main函数之前弹出的.解决该问题的办法是使用函数指针,例如:

	typedef BOOL (APIENTRY *PGetProductInfo)(DWORD, DWORD, DWORD, DWORD, PDWORD);
	PGetProductInfo pf = (PGetProductInfo)GetProcAddress(GetModuleHandleW(L"kernel32.dll"), "GetProductInfo");
	if (NULL == pf)
		return TRUE;

	DWORD dwType = 0;
	(*pf)(osvi.dwMajorVersion, osvi.dwMinorVersion, 0, 0, &dwType);

就不会发生错误了.  

   如果使用了Comctl32.dll,则可能弹出提示"无法定位序数 380 于动态链接库 COMCTL32.dll 上".例如,在VS中定义_WIN32_WINNT定义为0x0601,但是程序中有这样一个调用:

LoadIconMetric(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_TRAY_ICON), LIM_SMALL, &m_ndiTrayIcon.hIcon);

在xp中运行时,会弹出对话框提示上述的错误,而且是在执行到main函数之前提示的.需要注意的是,只要编译LoadIconMetric函数,运行的时候即使不调用,仍然会发生这样的错误.

 

 

 

posted on 2012-12-19 20:14  零一小子  阅读(1979)  评论(0编辑  收藏  举报

导航