那你把DLL也打包给他们不就行了

解决方案 »

  1.   

    用depends工具看看依赖的dll,打包一起。
    或者工程编译链接的使用选择链接MFC的静态链接库
      

  2.   

    怎么知道我的程序中用到了哪些dll?另外,我怎样才能知道哪些dll用户的系统中肯定会有了,哪些可能没有呢?
      

  3.   

    工程属性Configuration Properties/General 看到右边的Use of MFC选择Use MFC in a Static Library.
      

  4.   

    我选择了那个,可是编译的时候,却出来一大串”无法 解析的外部符号“:
    1>正在链接...
    1>install.obj : error LNK2001: 无法解析的外部符号 __imp__MoveWindow@24
    1>install.obj : error LNK2001: 无法解析的外部符号 __imp__SHBrowseForFolderA@4
    1>install.obj : error LNK2001: 无法解析的外部符号 __imp__CoCreateInstance@20
    1>install.obj : error LNK2001: 无法解析的外部符号 __imp__DialogBoxParamA@20
    1>install.obj : error LNK2001: 无法解析的外部符号 __imp__SetWindowTextA@8
    1>install.obj : error LNK2001: 无法解析的外部符号 __imp__CoUninitialize@0
    1>install.obj : error LNK2001: 无法解析的外部符号 __imp__ShowWindow@8
    1>install.obj : error LNK2001: 无法解析的外部符号 __imp__RegSetValueExA@24
    1>install.obj : error LNK2001: 无法解析的外部符号 __imp__SendDlgItemMessageW@20
    1>install.obj : error LNK2001: 无法解析的外部符号 __imp__EndDialog@8
    1>install.obj : error LNK2001: 无法解析的外部符号 __imp__RegQueryValueExA@24
    1>install.obj : error LNK2001: 无法解析的外部符号 __imp__GetDlgItem@8
    1>install.obj : error LNK2001: 无法解析的外部符号 __imp__GetWindowTextA@12
    1>install.obj : error LNK2001: 无法解析的外部符号 __imp__RegCreateKeyExA@36
    1>install.obj : error LNK2001: 无法解析的外部符号 __imp__CoInitialize@4
    1>install.obj : error LNK2001: 无法解析的外部符号 __imp__RegOpenKeyExA@20
    1>install.obj : error LNK2001: 无法解析的外部符号 __imp__SendMessageA@16
    1>install.obj : error LNK2001: 无法解析的外部符号 __imp__SHCreateDirectoryExA@12
    1>install.obj : error LNK2001: 无法解析的外部符号 __imp__LoadIconA@8
    1>install.obj : error LNK2001: 无法解析的外部符号 __imp__SHGetPathFromIDListA@8
    1>install.obj : error LNK2001: 无法解析的外部符号 __imp__LoadBitmapA@8
    1>install.obj : error LNK2001: 无法解析的外部符号 __imp__GetWindowRect@8
    1>install.obj : error LNK2001: 无法解析的外部符号 __imp__ScreenToClient@8
    1>install.obj : error LNK2001: 无法解析的外部符号 __imp__SHGetFolderPathA@20
    1>install.obj : error LNK2001: 无法解析的外部符号 __imp__RegCloseKey@4
    1>C:\1\zywb\Release\install.exe : fatal error LNK1120: 25 个无法解析的外部命令我搜了一下,是要在“链接器”-》“输入”-》“附加依赖项”中添加需要的lib,是吗?怎样根据“无法解析的外部符号,知道哪些库需要添加?
      

  5.   

    另外,我没有使用MFC,我是纯SDK方式,语言是C++,设置那个”链接MFC的静态链接库“有用吗?
      

  6.   

    用dependency查了一下,是不是依赖这六个DLL?是不是把这六个DLL打包到安装文件夹,就行了呢?可是我觉得象USER32.DLL之类的,用户的系统肯定是有的吧?哪些DLL用户会没有呢?
      

  7.   

    发现一个非常奇怪的现象:
    我的这些程序,到了新系统中,都会工作不正常。但是,我按你说的选择了“在静态库中使用MFC",然后编译,出现一大堆错误,都是“无法解析的外部符号”。当然编译不成功,也无法生成有效的可执行文件。我只好把它换回“使用标准Windows库“.然后再编译,等于是还原了。可是无意中我发现:到了新系统中,install.exe竟然可以正常安装了!
    我觉得很奇怪,又用uninstall.exe试验了一下,在新系统下它确实无法正常工作,显示:“应用程序无法启动,因为应用程序的并行配置不正确。有关详细信息,请参阅应用程序事件日志。”,上网搜了一下,这是由于缺乏vs2008的运行库所致。但我回到旧系统,还是象上次那样。先选择"在静态库中使用MFC",编译当然一堆错误,再换回“使用windows标准库”,再编译,成功。拷到新系统,uninstall.exe也可以正常工作了。
    最后一个是真正的输入法文件xxxx.ime,这个它原来在新系统中也不能正常工作,同样处理,先选择“在静态库使用MFC”,编译,再还原“使用标准windows库“,编译,到了新系统。这个也能正常工作了!很奇怪的事情,先选择”在静态库中使用MFC“,编译不是失败了吗?我也没有导入任何东西,然后还原,还是”使用标准windows库“。再编译,结果三个程序:install.exe    uninstall.exe    xxxx.ime,都能正常工作了。不知这是什么原因造成的?
      

  8.   

    这都是系统的库,不需要你打包的。你都使用静态的MFC库及静态的运行时库,就不需要打包库了。如果使用动态的,则要将MFC dll和运行时库dll打包带上的
      

  9.   

    同时我发现:生成的可执行文件增大了一点。xxxx.ime原来是404K,现在增大为483K. 其他的install.exe和uninstall.exe没太注意,应该也增大了一些。看来静态库确实链接进去了,只是我不太懂,为什么选择了一下“在静态库中使用MFC”,编译并没有成功,显示一堆错误,然后换回“使用标准windows库“,按理只是还原了,可是静态库却链接进去了,不知何故?
      

  10.   

    MFC dll和运行时库dll名字叫什么?只有两个dll吗?我用的是vs2008。
      

  11.   

    1、如果是unicode程序,mfc库是mfc90u.dll;如果是非Unicode程序,则是mfc90.dll
    2、运行时库:C运行时库msvcr90.dll和C++运行时库msvcp90.dll
      

  12.   

    如果是sdk方式,不是用mfc,但是语言用的是c++,是不是只需要后面的msvcp90.dll就够了?
      

  13.   

    如果是sdk方式,不是用mfc,但是语言用的是c++,是不是只需要后面的msvcp90.dll就够了?
    C运行时库msvcr90.dll和C++运行时库msvcp90.dll,这两个都要的
      

  14.   

    如果是sdk方式,不是用mfc,但是语言用的是c++,是不是只需要后面的msvcp90.dll就够了?
    C运行时库msvcr90.dll和C++运行时库msvcp90.dll,这两个都要的
    非常感谢!那请问:这两个库拷到什么地方呢?是放在我自己的程序目录里就能自动生效了?还是要放到系统目录?就是c:\windows\system32非常感谢,我是不太懂,是把这两个dll放进去,它就会自动生效吗?
      

  15.   

    我已经把mfc90.dll    msvcr90.dll    msvcp90.dll三个dll都拷到了新系统的c:\windows\system32目录下,再执行,也没用,还是弹出那个无法执行的对话框。我的程序非unicode,是ansi工程,新系统是vista。
      

  16.   

    你用VS自带的depends工具查看一下,看看还少哪些库
      

  17.   

    你是不是用的是Debug版本的?
      

  18.   

    我的install.exe是release版本的,其中用自定义资源的形式导入了几个文件,其中包含uninstall.exe和zywb.ime两个文件,这两个文件我均编译成release版。
    你问我的是我的程序是debug版本的?还是msvcr.dll库是debug版本的?msvcr.dll等库也分debug版和release版吗?那么怎么知道是什么版本的?
      

  19.   

    我在vs2008里搜索了一下,没有找到depends,我是用以前的vc6.0里自带的depends来查看的,查看了install.exe,结果我截了个图(左上方好象就是依赖的dll,我为了能在一页显示全,把展开的合上了,不知道这样是否影响判断依赖的dll?,初次使用这些工具,不太懂):从上面好象可以看出:除了系统已有的dll以外,它好象只需要一个msvcr90.dll。可这个dll,我已经拷到新系统的windows\system32目录了。
      

  20.   

    我在已经安装vs2008的盘中搜索,发现了好几个mscvr90.dll,我选择了这一个文件夹的:C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT\msvcr90.dll我觉得这个是vs2008的安装目录的,应该可靠些。不知道对不对?
      

  21.   

    你使用VS2008编程的时候, 当你要使用某个API的时候, 最好是注释下API的说明, 支持哪些系统或者有些什么限制之类的.你这种问题, 不像是缺dll, 也不像是找不到接口.
    而是像数据处理错误,  也就是某些结构体可能在你的开发环境中是一个长度, 在运行环境中又是另一个长度  (依赖于dll版本), 这样就会导致程序访问错误而crash.
      

  22.   

    项目、属性、配置属性、平台工具集: v120_xp
      

  23.   

    虽然使用静态库编译没成功,但只是到某一文件开始出现错误的,之前的某些文件正确编译并产生了需要的中间文件,导致后面的成功,,,纯属猜测而已,LZ有空可以比较一下,
    若查明原因,来贴里公布一下吧
    我刚才比较了一下,先设为“在静态库中使用MFC”,然后再设回“使用标准windows库“后,生成的文件体积均增大,比如unstall.exe从96K增大到140K,而且到新系统中就可以用了。我还发现:扩展名这.pdb的文件均增大了很多,象install.pdb, uninstall.pdb以及zywb.pdb。看起来好象是你说的原因。可是,我把这些文件删除,也删除了release目录中所有文件,只留.cpp源文件,.h头文件,以及.rc资源文件,然后再编译,发现生成的uninstall.exe仍然为140K,也就是说也包含了静态库了。但我想:有时候我假如不想把静态库链接进去呢?这样一来还不行了。只有把原来的没有改过的工程拿来编译,才会生成原来的96K的不含静态库的文件。看来也不是中间文件的问题,原因暂时不明。
      

  24.   

    1.mfc 程序需要设置为静态链接 
    2.把这个目录下面的文件,C:\Program Files\Microsoft Visual Studio 9.0\VC\redist 随同程序一起发布 
      根据你的项目选择相应子目录里面的数据,用此方法,winpe 也可以运行mfc程序.
    3.如果目标机器不是winpe,那么让目标机器安装vs对应的补丁包,很小的,就几MB.
     象3d之类的软件在安装的时候,会自动安装vs相应的补丁包。基本用以上方法可以解决你要的问题
      

  25.   

    打包后再release运行,这样可以再XP下运行吧