2017-07-10 8 views
1

私がのstd ::文字列でのCreateProcessにしようとしていますが、私はC++のCreateProcess ::文字列

に新しいです

をLPSTRするのstd ::文字列を変換する方法を見つけ出すことはほとんどどこでも検索しました

私はGUIを作っています。ボタンをクリックすると、私が入力したパスと32ビットまたは64ビットのチェックボックスに基づいてプログラムを起動します。

私はシステムを変更するクライアントディレクトリの

::文字列^はstdする::文字列

std::string path = this->getClientDirectory(); // Get the directory that the user has set 

// Get the EXE bit that the user has ticked. 
std::string exe; 
if (this->isClient32Ticked) 
    exe = "client_x32.exe"; 
else 
    exe = "client_x64.exe"; 

//add the exe name to the end of the string. 
path.append("\\"); 
path.append(exe); 

CreateProcess(NULL, path, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); 
+0

パスを試してください: –

+0

[std :: string]から 'LPSTR'に変換できません(https://stackoverflow.com/questions/3906515/cannot-convert-from-stdstring-to) -lpstr) – TheKitchenSink

+0

ありがとう@TheKitchenSink – StokesMagee

答えて

0

あなたはどちらかCreateProcessAc_strメソッドを使用する必要があります...

CreateProcessA(NULL, path.c_str(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); 

またはpathを作りますstd::wstringであり、dataCreateProcess(またはCreateProcessW)を使用し、std::basic_string::dataには、constバージョン(これはC++ 17で発生するはずですが、MSVCはそれに追いついていません)。

CreateProcessW(NULL, path.data(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); 

のCreateProcessのWバージョンは、あなたがそれの「読み取り専用」のバージョンを渡してはならないことを意味し、インプレースコマンドパラメータを変更することがあります。不思議なことに、Aバージョンはそうではありません。

+0

'data()'は 'const'メイト –

+0

@ LightnessRacesinOrbitです。MSVC(おそらく一時的な)違反に責任があるのはおそらく初めてのことです。幸いにも、答えの残りの半分はまだ立っています。 – zneak

+0

Aバージョンは内部的に文字列を変換し、Wバージョンを呼び出します。その変換は文字列を一時バッファにコピーするので、入力がconstであることは驚きではありません。 – MSalters

1

LPSTRは、Long Pointer STRingの略です。これはchar []またはchar *と等価です。

c_str()メソッドを使用して、std :: stringからcharバッファを取得することは可能です。しかし、そのバッファはconstになります。

ここで行う必要があるのは、charの非constバッファを割り当てて、std :: string const-charバッファをそのバッファにコピーすることです。

char* path = new char[exe.size() + 1] = {'\0'}; //Create the non-const char buffer initialized with zero characters 
strncpy(path, exe.c_str(), exe.size());   //Copy the content from exe to path 
CreateProcess(NULL, path, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); 
delete path[]; 

私はまた、あなたのポストにあなたの問題を引き起こすかもしれない何かを参照してください。

あなたは変換システム::文字列^はstd ::文字列にするに言及しているという事実。時にはこれはうまくいくこともあり、ときどきそうではありません。理由は、STLと比較して.NETストア文字列の方法です。これはあなたの質問ではないので、私はここで理由の詳細には触れません。

System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(System::String^) 

をあなたはネイティブから管理対象に文字列を渡すときに、特別なことをする必要はありません:ネイティブ文字列に管理する文字列を渡すときは、常に使用して、最初にそれをマーシャリングする必要があります。

+0

'char []'はポインタではありません。 –

+0

ポイントは、charバッファのデータストレージの概念を説明することでした。配列の最初の要素のアドレスがポインタです。 – plfoley