0

私は shellexecute を試しました、私は createprocess を試しましたが、これで何もできないようです。

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

明らかに (ファイル名) は単なるプレースホルダーです。次のような有効なファイル名が付けられます。

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

4

3 に答える 3

2

ファイル名にエスケープされたバックスラッシュを使用していますか? 例えば:;

"c:\123.doc"

次のようにする必要があります。

"c:\\123.doc"

編集:

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

私のために働きます。

現在のプロセスを置き換えないようにするには、代わりにspawnlpを使用します

于 2009-03-01T00:18:28.253 に答える
0

CreateProcessこれを作成して操作する方法があると確信しShellExecuteていますが、これを行う最も簡単な方法は古き良きものになると思い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 がそれを行うはずです)、非推奨の API を使用しません。

于 2009-03-01T00:33:24.597 に答える