2009-03-01 4 views
0

私はshellexecuteを試してみました。私はcreateprocessを試しましたが、何もすることができません。C++ビルダーでコマンドライン "explorer/n、/ select、(filename)"を実行するにはどうすればよいですか?

(コンソールウィンドウの実際のコマンドプロンプトで)コマンドラインを手動で実行していますが、これまでに試したことはありませんが、C++ビルダーアプリケーション内から実行することはありません。

明らかに(ファイル名)は単なるプレースホルダです。あなたは、ファイル名にバックスラッシュをエスケープ使用しているそれは、

エクスプローラ/ N、/select,c:\123.doc

答えて

2

ような、有効なファイル名を与えられるでしょうか?例えば:;

"c:\123.doc" 

は次のようになります。

"c:\\123.doc" 

編集:

execlp("explorer", "/n, /select,c:\\foo.txt", 0) 
私の作品

。現在のプロセスを置き換える避けるため

、私はこれでCreateProcessShellExecute仕事をするために何らかの方法があります確信しているが、私はこれを行うための最も簡単な方法は、古き良きだろう疑う代わり

+0

ファイル名文字列は組み込みのファイル処理コンポーネントによって処理されるため、自動的に二重バックスラッシュで実装されます。いずれのタイプも動作しません。私は両方を試みた。 – MrVimes

+0

別の考え方 - ファイル名ではなく、ディレクトリ名ではないと思いますか? –

+0

おっと、ストライキはありません –

0

spawnlpを使用system 、例えばsystem("explorer /n, /select,c:\\123.doc")

それは私を悩ませたという理由だけで、私は先に行って、のCreateProcessでこれを行う簡単なプログラムを書いた:

#define UNICODE 
#include <windows.h> 
#include <string> 

void SimpleWriteConsole(std::wstring msg) { 
    DWORD written = 0; 
    WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), 
      msg.c_str(), msg.length(), &written, NULL); 
} 


int wmain(int argc, wchar_t **argv, wchar_t **envp) { 
    SimpleWriteConsole(L"Opening explorer...\n"); 
    std::wstring commandLine = L"explorer /n, /select,"; 
    if(argc < 2) { 
     SimpleWriteConsole(L"Please include a file to select.\n"); 
     return EXIT_FAILURE; 
    } 
    commandLine += argv[1]; 
    STARTUPINFO startupInfo; 
    ZeroMemory(&startupInfo, sizeof(startupInfo)); 
    startupInfo.cb = sizeof(startupInfo); 
    PROCESS_INFORMATION procInfo; 

    if(! CreateProcess(NULL, const_cast<wchar_t*>(commandLine.c_str()), 
      NULL, NULL, 0, 0, NULL, NULL, &startupInfo, &procInfo)) { 
     SimpleWriteConsole(L"Couldn't create process :(\n"); 
     return EXIT_FAILURE; 
    } 
    CloseHandle(procInfo.hThread); 
    CloseHandle(procInfo.hProcess); 
    SimpleWriteConsole(L"Hooray launched explorer.\n"); 
    return EXIT_SUCCESS; 
} 

それはCを取る:abc.txtパーツ\コマンドラインでパラメータとして。余分なDOSボックスはなく、既存のプロセス(execはそれを行うはずですが、btw)を食べず、廃止予定のAPIは使用しません。

+0

動作しますが、DOSボックスは開いたままにしておきます。私はむしろそれを持っていないだろう。 – MrVimes

0

OK、これらの返信が有用であったが、残念ながら、どちらも私はむしろ私のアプリでは持っていません欠点を持っている...

execlp()が閉じるように、呼び出しプロセスが発生します。

system()には、エクスプローラウィンドウを閉じるまで表示されているDOSボックスが表示されます。

私はあなたの答えにも素晴らしいです。

私はwinexecで動作するようにしました。この関数は唯一の16ビット のWindowsとの互換性のために提供されて

注 - WINEXECのヘルプファイルには、これは言うにもかかわらず。アプリケーションはCreateProcess関数を使用する必要があります。

createprocessが機能しないため、今のところwinexecに固執します...

WinExec(String("explorer /n, /select,"+ FileName).c_str(),SW_SHOWDEFAULT);