none
win7 64bit 下DLL的链接过程? RRS feed

  • 问题

  • 环境:win7 64bit 旗舰版 + Visual Stduio 2010 + DXSDK(Jun 2010)

    Keywords:

     (size)        d3dx9_43.dll     d3dx9d_43.dll      d3dx11_43.dll    d3dx11d_43.dll

    System32\        2345KB           2624KB              271KB                   301KB

    SysWOW64\      1952KB           2209KB              243KB                   262KB

    Error:

    0xc000007b

    PS: 这个问题只出现在用DEBUG模式编译的demo.exe上,用RELEASE模式编译的demo.exe则没有任何问题

    最近用DX9做了一个32bit的DEMO,发现了一些奇怪的事情。demo用到了最新的DXUT框架,虽然我在创建Device时指定了最低的DX版本需求为D3D_FEATURE_LEVEL_9_1,但是在运行的时候demo。exe会同时链接d3dx9d_43.dll和d3dx11d_43.dll(DEBUG,相应的在Release模式下也会同时链接d3dx9_43.dll和d3dx11_43.dll).

    现在转到另外一台win7 64bit的计算机B上(暂将开发用的计算机叫A,测试用的计算机叫B), VS2010 Redist + DX Redist(Jun 2010) + .net FrameWork 4.0都已经正确安装,配置环境和程序开发的计算机上一样。

    第一次问题出现:

    我将在DEBUG模式下编译的demo.exe以及d3dx9d_43.dll、d3dx11d_43.dll(System32)一起拷贝到B上,打开会弹出一个“0xc000007b”的错误,并且程序无法运行。

    随后将SysWOW64下的d3dx9d_43.dll、d3dx11d_43.dll拷贝到B上替换之,程序能够正常运行。

    第二次问题出现:

    仍然是在DEBUG模式下,我为demo.exe制作了一个安装程序,安装文件中包含demo.exe、D3DCOMPILER_43。dll、d3dx11d_43.dll、d3dx9d_43.dll、DSOUND.dll、IMM32.dll、VERSION.dll.(其中的D3DCOMPILER_43.dll、DSOUND.dll、IMM32.dll、VERSION。dll造成错误的可能性已经排除。)安装项目检查到的依赖项中除了上述的这些DLL文件外,还包含一个Microsoft_VC100_DebugCRT_x86.msm。

    demoSetup.exe拿到计算机B上安装好之后,安装的demo.exe能够正常运行。检查随demo.exe一同安装到B上的d3dx11d_43.dll和d3dx9d_43.dll,发现它们的大小分别为262KB和2209KB, 这和在SysWOW64下两个文件的大小是一样的。但奇怪的是,在VS中检查安装文件各依赖项的属性时,各依赖项的sourcePath都指向的是system32。而在system32下d3dx11d_43.dll和d3dx9d_43.dll的大小分别为301KB和2624KB。

    为什么在安装项目中sourcePath指向的是system32,而实际安装文件安装完成之后得到的文件却和SysWOW64下的文件大小一样?!

    第三次问题出现:

    在本机(计算机A)上DEBUG模式下调试demo.exe, 从VS的输出中可以明显的看到demo.exe在运行时链接的是SysWOW64下的d3dx11d_43.dll和d3dx9d_43.dll,其他所有的依赖项都是链接的SysWOW64下的,调试时程序能够正常运行。

    于是我手动将demo.exe和system32\d3dx11d_43.dll、 system32\d3dx9d_43.dll拷贝到本机(A)上的一个独立文件夹中。打开demo.exe,没有任何问题。

    为什么demo.exe和system32\d3dx11d_43.dll、 system32\d3dx9d_43.dll在本机上可以正常运行,在计算机B上就会出现0xc000007b的错误呢?难道是因为A上装了DXSDK,而B上没有装?!

    然后我将该独立文件夹中的d3dx11d_43.dll和d3dx9d_43.dll删除,用dependency walker跟踪demo.exe,发现demo.exe在链接各个依赖项时都是从system32目录下获取的。

    为什么VS在调试时,输出显示demo.exe的各个依赖项是从sysWoW64下得到的,而dependency walker单独跟踪demo。exe时显示各个依赖项是从system32下得到的?!

    问题总结:

    1.DEBUG模式下生成的32bit demo.exe运行在64bit环境中,它的各个依赖项到底是从哪个目录(system32、sysWOW64)下获取的?

    2.为什么VS在制作安装文件时,项目中SourcePath指向的文件(d3dx11d_43.dll、d3dx9d_43.dll)和实际安装解压出来的文件(d3dx11d_43.dll、d3dx9d_43.dll)的大小会不一样?

    可能问题没描述清楚,敬请原谅

    如有疑问,我会及时回复~

    2011年5月11日 3:32

全部回复

  • Debug DLL 不是系统原生的是由开发工具安装的

    你不应该在非开发的系统上运行调试版本 program。

    调试版本
    program 会连结 debug 版本的DLL(MFC,msvcXXX,..。)

    这些亦不能简单复制目标机器。

    如必须在目标机器上运行调试版本

    可到微软 找寻那些 Debug 版本 DLL 的安装程序。

    MFC中,VC 的 Debug DLL 的安装程序是应该有的

    DX 的就不知道了
    2011年5月12日 1:27