none
VS2015编译出来的dll,在xp上LoadLibrary失败。 RRS feed

  • 问题

  • 首先,这个dll在windows7,windows10使用一直是正常的。之前使用vs2010编译的时候,在xp上运行也是正常的。

    下面是我写的测试载入的程序:

    HMODULE LoadIt(const char * s)
    {
    	HMODULE dll = LoadLibrary(s);
    	if ( dll == NULL)
    	{
    		printf("Load %s error,err = %d\n",s,GetLastError());
    	}
    	else
    	{
    		printf("Load %s success\n",s);
    	}
    	return dll;
    }
    
    int GetInt() { return 1; }
    
    void foo()
    {
    	static int bar = GetInt();
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	LoadIt("DotaSimulation.dll");
        return 0;
    }

    这个程序,在xp上面是运行正常的。但是,如果注释掉了其中的,“static int bar = GetInt();”,甚至是里面的"GetInt()"改成一个常数,在xp机器上就载入dll失败了,err=998(当然在win10机器上运行还是正常了)。

    编译所有的项目,toolset都选的是“v140_xp”。用rundll32.exe载入这个dll也是失败的。在Unity3d中载入这个dll也是失败的。

    https://pan.baidu.com/s/1eS0q9Su

    这是这个dll,大家有兴趣的话,可以测试一下。

    2016年9月17日 7:20

答案

  • 算了,我找到解决方案了。

    https://connect.microsoft.com/VisualStudio/feedback/details/2808221/problems-with-loadlibrary-and-vs2015-xp-toolset

    这个太坑啦。

    • 已建议为答案 Baron Bi 2016年9月19日 7:04
    • 已标记为答案 heroboy_ywq 2016年9月19日 8:38
    2016年9月17日 7:45

全部回复

  • 算了,我找到解决方案了。

    https://connect.microsoft.com/VisualStudio/feedback/details/2808221/problems-with-loadlibrary-and-vs2015-xp-toolset

    这个太坑啦。

    • 已建议为答案 Baron Bi 2016年9月19日 7:04
    • 已标记为答案 heroboy_ywq 2016年9月19日 8:38
    2016年9月17日 7:45
  • 英文没看太懂,有没有具体解决方案呢,我也遇到这个问题了,求指教
    2016年9月18日 8:06
  • Hi heroboy_ywq,

    感谢在MSDN论坛发帖。

    如果你的问题已经解决,请标记为答案。谢谢你的支持与合作。

    Best Regards,
    Sera Yu


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.

    2016年9月19日 7:05
  • 原解决方案链接已失效,为了造福后人,这里是原因及解决方案:

    这是由于2015的“线程安全变量初始化”特性导致的,此特性为c++11所要求,从vs2015update2开始引入,此特性不支持xp

    如果dll中使用了全局变量、静态变量等都有可能在xp上触发这个问题,根本原因在tls

    解决方案:

    关闭这个特性

    在编译命令行中追加选项:

    /Zc:threadSafeInit-

    即可

    注意那个减号,别忘了

    /Zc:threadSafeInit-
    • 已建议为答案 luteng 2018年5月31日 2:49
    2018年5月31日 2:49