2010-11-20 107 views
3

那么我试图编译一个我正在处理的小测试应用程序。更改代码生成后用代码255退出的特定代码行

所以让事情变得短而简单:

当我设置从“多线程DLL”到“多线程”我的代码生成摆脱一些依赖,下面的代码行崩溃我的应用程序(其中它通常运行没有任何瑕疵)

的崩溃发生时,我想很短的路径转换为长路径。作为这样的:

LPCSTR tmp = reinterpret_cast<LPCSTR>(getenv("Temp")); 
GetLongPathNameA(tmp,tempFolder,MAX_PATH); 

崩溃,特别是发生在第一个行:

LPCSTR tmp = reinterpret_cast<LPCSTR>(getenv("Temp")); 

所以任何想法在这里为什么它当你切换的代码生成模式突然停止工作?谢谢!

编辑:

经过一些代码重写,我设法找出它执行

getenv("Temp"); 

非常非常奇怪的透视时,因为它在其他模式

+0

当您构建项目时是否有任何警告? – Dialecticus 2010-11-20 11:46:29

+0

不是没有,它只是出于一些奇怪的原因代码255退出 – zeta 2010-11-20 12:12:36

+1

为什么'reinterpret_cast'是必要的? 'getenv'的结果是'char *',它应该自动转换为'LPCSTR'(即const char *')。如果你在没有演员的情况下得到了错误,他们可能值得注意。 – 2010-11-25 01:19:45

回答

0

尝试工作特别崩溃重建项目。清理它,确保输出文件夹中没有任何内容,为了好的措施,删除.ncb,然后构建。

+0

nope,不起作用... – zeta 2010-11-20 11:54:09

1

确保所有项目(和这些项目中的所有文件)一直规定编制,并用同样版本的运行时库的链接,即多线程静态,你的情况。如果混合这些选项,编译和链接的程序将会有未定义的行为。还要确保你编译并链接到正确版本的外部库(MFC等)。在某些情况下,您被限制使用特定版本的运行时间,例如如果您与.Net进行互操作,则必须使用多引导的dll版本。

0

你从运行时动态切换到静态后指定libcmt.liblibcpmt.lib作为连接设置的依赖?如果没有,请尝试。然后重建。

+0

libcmt.lib默认情况下已经链接,所以它似乎。 libpcmt.lib我设法手动链接,但它仍然崩溃 – zeta 2010-11-20 12:31:59

0

你不应该使用的reinterpret_cast,因为它是由继承了或从其他类inheritting对象。只需使用基本类型的static_cast或指向基本类型的指针即可。

+0

你确定你没有考虑'dynamic_cast'? 'reinterpret_cast'与继承无关。 – 2011-01-12 12:50:37

+0

@尼克迈尔:是的,我是。 – 2011-01-12 15:11:20

1

你应该访问它之前检查的getenv()的返回值:

LPCSTR tmp = getenv("Temp"); 
if(tmp != NULL) 
    // do something with tmp 

我的猜测是,你的程序无法读取环境变量和访问所产生的空指针会导致程序崩溃。

Microsoft建议)getenv_s的使用(而不是,这里是他们的MSDN样品稍加修改你的工作:

char *tmp; 
size_t requiredSize; 

getenv_s(&requiredSize, NULL, 0, "Temp"); 
tmp = (char *) malloc(requiredSize * sizeof(char)); 
if (tmp != NULL) 
{ 
    getenv_s(&requiredSize, tmp, requiredSize, "Temp"); 
    if(tmp != NULL) 
     // do something with tmp 

    free(tmp); 
} 

我个人建议切换到WinAPI的函数GetEnvironmentVariable()来代替,这会给你一个更详细的错误信息(如果函数失败,请使用GetLastError()),这可能会帮助您找到问题的根源(或者使用其中一种替代方法解决问题)。