所以我正在编写一个程序,用于在附近的目录中执行其他文件(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 ++很陌生并且还在学习。
我很高兴听到不同的方法,虽然我想说明我的目标是避免使用多个重叠按钮,因为我需要将代码保持在最小尺寸。
答案 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::String
到std::string
到const char*
通常没什么意义。这些字符串类型转换只会阻塞您的代码并且非常有损,后两种类型很少能很好地表示Unicode字符。只有当您必须与现有的本机C或C ++代码进行交互时才能执行此操作。
您正在编写.NET代码,使用.NET Framework完成相同的操作,而不会产生开销和数据丢失:
Environment::CurrentDirectory = somedir;