2016-03-22 19 views
1

まもなく、起動オプション付きのプログラム、つまり私の場合はSteamを起動する必要があります。 私の小さなプログラムの初めにsystem()を使って起動しましたが、今はShellExecute()で起動したいですが、何もしません。どんな助けもありがとう。ShellExecuteが機能していないか、何か間違っていますか?

マイコード:

#define STEAM_DIRECTORY "\"D:\\Programs\\Steam\\steam.exe\"" 

int main() 
{ 
    .... 
    string runsteam_arg = STEAM_DIRECTORY; 
    runsteam_arg = runsteam_arg + " -login " + login[num - 1] + " " + pass[num - 1]; 
    system(runsteam_arg.c_str()); 
} 

編集:私は最後に実行するために必要なもの:

"D:\Programs\Steam\steam.exe" -login xxxx xxxx  

そしてもう一つ、私が前に使ってきたどのような

#include <Windows.h> 
#define STEAM_DIRECTORY "D:\\Programs\\Steam\\steam.exe" 

int main() 
{ 
    .... 
    string arguments = "- login " + login[num - 1] + " " + pass[num - 1]; 
    ShellExecute(NULL, (LPCWSTR)"open", (LPCWSTR)STEAM_DIRECTORY, (LPCWSTR)arguments.c_str(), NULL, SW_SHOWMINIMIZED); 
} 

誰かがCoInitializeEx()は何を説明することができますか?私はWindows APIが初めてです。

+6

者(LPCWSTR)のみあなたはそれが間違ってやっていたことを知らせるから、コンパイラを停止キャスト、それはやりましたあなたがそれを間違えないようにしてください。 L "のようにUnicodeリテラルを作成するには、Lの前に接頭辞を付けます。または、ShellExecuteA()を使用します。また、winapi関数の戻り値を無視しないでください。 –

答えて

2

(LPCWSTR)でポインタをキャストするだけでは不十分な場合は、文字列をANSIからUnicodeに変換する必要があります。

代わりにShellExecuteAに電話するのが最も簡単な解決策です。

#include <Windows.h> 
#define STEAM_DIRECTORY "D:\\Programs\\Steam\\steam.exe" 

int main() 
{ 
    .... 
    string arguments = "- login " + login[num - 1] + " " + pass[num - 1]; 
    ShellExecuteA(NULL, "open", STEAM_DIRECTORY, arguments.c_str(), NULL, SW_SHOWMINIMIZED); 
} 

取得本当のUnicode文字列はL"str"代わりの"str"書くためにあなたを必要とします。そしてstringの代わりにwstringを使用する必要があります。また

#include <Windows.h> 
#define STEAM_DIRECTORY L"D:\\Programs\\Steam\\steam.exe" 

int main() 
{ 
    .... 
    wstring arguments = L"- login " + login[num - 1] + L" " + pass[num - 1]; 
    ShellExecuteW(NULL, L"open", STEAM_DIRECTORY, arguments.c_str(), NULL, SW_SHOWMINIMIZED); 
} 

:で、たとえば、ShellExecute(Ex)を使用する前にCoInitialize()することを忘れないでください:

const HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); 
+0

メインポストを更新しました。 –

+0

CoInitializeExはCOM(コンポーネントオブジェクトモデルシステム)を初期化します。シェルのように、Windowsの一部はCOMを使用しているため、初期化されることに依存します。 –

+0

これは、ShellExecute()ドキュメントに明記されています。* ShellExecuteはコンポーネントオブジェクトモデル(COM)を使用してアクティブ化されたシェル拡張(データソース、コンテキストメニューハンドラ、動詞の実装)に実行を委任できるため、COMを初期化する必要がありますShellExecuteが呼び出される前に...確かに、ShellExecuteがこれらのタイプのシェル拡張を使用しないインスタンスがあり、これらのインスタンスではCOMの初期化は不要ですが、この関数を使用する前に常にCOMを初期化することをお勧めします。* " –

関連する問題