`
jgsj
  • 浏览: 951674 次
文章分类
社区版块
存档分类
最新评论

(转)[VS2005]解决“由于应用程序的配置不正确,应用程序未启动

 
阅读更多

我在编写DirectX程序,拷到别的机器上运行,结果都运行不起,都是应用程序配置不正确造成的,于是再上网查看信息,找到了一条非常有用的帖子,供大家使用,文章版权归原作者。

Code:
  1. 今天在准备发布用VS2005写的那个程序时,拷贝到我同事机器上,双击突然出现了“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题“,这个问题很让我意外,以前只出现过缺少DLL的情况,而这次出现这个问题,让我一时没办法。想想,无非是两个原因引起的,要么是他没有安装VS2005的原因,要么是我的程序里依赖了其它的一些库。于是百度一下,发现好多相关主题。我是按照这个帖子解决的:
  2. 在VS2005下用C++写的程序,在一台未安装VS2005的系统上,
  3. 用命令行方式运行,提示:
  4. “系统无法执行指定的程序”
  5. 直接双击运行,提示:
  6. “由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”
  7. 以前用VC6和VS2003的话,如果缺少库文件,是会提示缺少“**.dll”,但是用VS2005却没有这样的提示。
  8. 自己实验了一下,感觉以下几种解决办法是可行的:
  9. 方法一:
  10. 在类似C:/ProgramFiles/MicrosoftVisualStudio8/VC/redi
  11. st/Debug_NonRedist/x86/Microsoft.VC80.DebugCRT下找到了下列文件:
  12. msvcm80d.dll
  13. msvcp80d.dll
  14. msvcr80d.dll
  15. Microsoft.VC80.DebugCRT.manifest
  16. 把这几个文件拷贝到目标机器上,与运行程序同一文件夹或放到system32下,就可以正确运行了。
  17. 其他release版、MFC程序什么的都是拷redist下相应文件夹下的文件就可以了,文件夹后都有标识!
  18. 方法二:
  19. 修改编译选项,将/MD或/MDd改为/MT或/MTd,这样就实现了对VC运行时库的静态链接,在运行时就不再需要VC的dll了。
  20. 方法三:
  21. 工程-》属性-》配置属性-》常规-》MFC的使用,选择“在静态库中使用mfc”
  22. 这样生成的exe文件应该就可以在其他机器上跑了。
  23. 方法四:
  24. 你的vc8安装盘上找到再分发包vcredist_xxx.exe和你的程序捆绑安装
  25. C#调用c++制作的DLL时,一些参数的赋值问题如char*,结构体
  26. c++dll中的原型
  27. inttest(char*xm,char*fa,UINT&VerNum,doubleMile,char*SurvMile);
  28. c#调用时
  29. [DllImport(@"Test2.DLL")]
  30. publicstaticexterninttest(stringxm,stringfa,refUInt32VerNum,doubleMile,StringBuilderSurvMile);
  31. 注意:
  32. 1.调用的时候,有部分char*,如果想获得返回值,不能用string作参数来进行调用,这样得不到返回到结果,可以用StringBuilder来声明变
  33. StringBuilderstrMyTemp=newStringBuilder(256);//256是长度
  34. 2.结构体的引用传递
  35. 首先在c#中定义和c++相同的结构体,如果是引用传递,在结构体前面加上[In,Out]
  36. [DllImport(@"test.dll")]
  37. publicstaticexterninttest([In,Out]SLineData[]lndt,refUInt32length);
  38. 3.其他的类型如整形等等用ref加上数据变量则可获得返回值
  39. 使用C++调用C#的DLL
  40. SwfDotNet是C#编写的,作者的C#水平,真是令我佩服。这是个特别好的读写Swf文件的库。但是,我要用在C++项目中,怎么让C++调用C#的DLL呢。今天一上午都在琢磨这个问题,耽误了很多时间,原因是编译是出现:
  41. warningC4819:该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为Unicode格式以防止数据丢失。
  42. 接着就是一大堆的0x01等等。自己做了个Sample,仔细分析发现还是自己没有搞清楚。正确的操作如下:
  43. 1创建C#DLL,需要指定应用类型为“类库”,代码:
  44. namespaceCSLib
  45. {
  46. publicclassClass1
  47. {
  48. privatestringname;
  49. publicstringName
  50. {
  51. get
  52. {
  53. returnname;
  54. }
  55. set
  56. {
  57. name="YourName:"+value;
  58. }
  59. }
  60. }
  61. }
  62. 2C++客户程序,是个控制台应用,代码:
  63. #using"../debug/CSLib.dll"
  64. usingnamespaceCSLib;
  65. int_tmain(intargc,_TCHAR*argv[])
  66. {
  67. Class1^c=gcnewClass1();
  68. c->Name="zzj";
  69. printf("%s/n",c->Name);
  70. return0;
  71. }
  72. 3几点要记住:
  73. 1使用#using引用C#DLL,而不是#include。我就是想当然的使用了后者,所以浪费了一上午的时间;
  74. 2别忘了usingnamespaceCSLib;
  75. 3使用C++/clr语法,采用正确的访问托管对象,即:使用帽子'^',而不是星星'*'(选择菜单[项目]->[属性],在其[属性页]中的[公共语言运行库支持]项)
  76. 提示dll配置失败把*.dll.embed.manifest及*.dll.intermediate.manifest(dll输入进去)

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics