Visual C ++中的chdir(变量)不接受字符串变量

时间:2014-10-09 21:40:26

标签: visual-c++ c++-cli

所以我正在编写一个程序,用于在附近的目录中执行其他文件(exe,bat)。

请注意我已经搜索了很多这个,虽然我发现了一些非常类似的问题,但我还没有找到解决方案,或者至少和替代方法,...

我在Windows上使用microsoft visuall c ++ 2013。

这里是:

String ^somedir; 

private: System::Void radioButton1_CheckedChanged(System::Object^ sender, System::EventArgs^ e) { 
somedir = "0"; //Yes, a folder named 0 in the same directory as this program 
} 
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { 
_chdir(somedir.c_str()); //Navigate to exe dir, problem is here... 
system("some.exe"); //execute 
_chdir("../"); //go up a level. 
} 

顺便说一下,使用c ++ windows Forms,这不是控制台。

如果我用包含路径的带引号的字符串替换 somedir.c_str(),它的效果非常好,但是,我使用单选按钮将字符串变量 somedir 定义为有多个目录要执行。

为什么要使用chdir?因为可执行文件需要在它们自己的依赖项存在的目录中执行。我很高兴听到有另一种方法可以做到这一点。

我得到的错误是:

"Error: expression must have a class type." 

使用 _chdir(somedir.c_str());

"Error: argument of type 'System::String ^' is incompatible with parameter of type 'const char*' " 

使用 _chdir(somedir);

将光标悬停在 _chdir(somedir.c_str()); 内的 somedir 时会出现这些错误,因为它带有锯齿状红线下划线,表示错误。

原谅我,如果我做了一些愚蠢的事情,因为我对C ++很陌生并且还在学习。

我很高兴听到不同的方法,虽然我想说明我的目标是避免使用多个重叠按钮,因为我需要将代码保持在最小尺寸。

2 个答案:

答案 0 :(得分:1)

当您使用C ++ / CLI时,有托管和非托管(本机)指针。托管指针是具有插入符号^的指针。 C ++ / CLI是托管CLR代码和非托管C ++之间的桥梁,因此您必须从一个转换为另一个。

为了将托管String ^指针转换为本机C ++指针,您可以使用以下内容将其转换为:

System::String ^somedir = "your directory path here";
msclr::interop::marshal_context context; // Create a marshaling context
std::string conv_somedir = context.marshal_as< std::string >(somedir);

// Now use the std::string as you normally would used a standard library string
_chdir(conv_somedir.c_str()); //Navigate to exe dir, This should work now

// Test it
system("dir"); //execute 
_chdir("../"); //go up a level. 
system("dir"); //execute 

为了使用指针编组,您还需要在顶部包含它:

#include <msclr/marshal_cppstd.h>

您可以在此MSDN documentation中找到有关msclr::interop::marshal_as的更多信息。

  

此方法是在本机和托管类型之间转换数据的简化方法。要确定支持哪些数据类型,请参阅C ++中的封送处理概述。某些数据转换需要上下文。您可以使用marshal_context类转换这些数据类型。

答案 1 :(得分:1)

System::Stringstd::stringconst char*通常没什么意义。这些字符串类型转换只会阻塞您的代码并且非常有损,后两种类型很少能很好地表示Unicode字符。只有当您必须与现有的本机C或C ++代码进行交互时才能执行此操作。

您正在编写.NET代码,使用.NET Framework完成相同的操作,而不会产生开销和数据丢失:

   Environment::CurrentDirectory = somedir;