2017-04-24 12 views
0

からの出力を生成しないことにより、パラメータ付きのexeを実行しません。 Visual Studio C++では、ShellExecuteEx()でexeファイル内のパラメータを持つexeファイルを実行しようとするのが苦労しています。それが起こる方法は、Visual Studioでデバッグプログラムを実行することです(外部でも)。プログラムは他のプログラムを起動し、正常に実行されますが、.txtファイル出力は生成されません。パラメータを正しく使用したかどうかはわかりませんでした。 は、ここで私が達成しようとしている段階です:C++ ShellExecuteExは、最後の数日または数週間、そのexe

  1. スタートMainTest.exe (ScreenCapture.exeを開きます。exeファイル)
  2. Cmdを画面 - MainTest.exeが起動し、使用してScreenCapture.exeを開始する準備しますShellExecuteExを
  3. UACが管理者として実行、
  4. 新しいCMD画面をポップアップ表示 - ScreenCapture.exeは、パラメータやディレクトリを始め
  5. ScreenCapture.exeは、コマンドを完了し、
  6. を閉じ
  7. ScreenCapture.exeによって生成されたCaptureText.txtがScreenCapture.exeと同じダイレクトイロに配置されています。

問題は、自分のディレクトリ内にCaptureText.txtを取得していないか、このプログラムでパラメータが動作しているという証明がないことです。

ここで、パラメータを指定してTest.exeを使用せずにScreenCapture.exeを実行すると、動作し、.txtファイルが生成されます。

#include "stdafx.h" 
#include <isostream> 
#include <fstream> 
#include <string> 
#include <Windows.h> 

int main() 

{ 

    auto str = _T("C:\\Users\Engrsky\Pictures\Screenshot.png ScreenCapture -l eng") 

    SHELLEXECUTEINFO shExInfo = {0}; 
    shExInfo.cbSize = sizeof(shExInfo); 
    shExInfo.fMask = SEE_MASK_NOCLOSEPROCESS; 
    shExInfo.hwnd = 0; 
    shExInfo.lpVerb = _T("runas");     
    shExInfo.lpFile = _T("C:/Program File (x86)/Test/ScreenCapture.exe");   
    shExInfo.lpParameters = str;     
    shExInfo.lpDirectory = 0; 
    shExInfo.nShow = SW_SHOW; 
    shExInfo.hInstApp = 0; 

} 

例:

はここにコードだ使い方だけでコマンドプロンプト、ScreenCapture.exeはパラメータで完璧に動作します。

Adminstrator:私はこのようにそれを入力するプロンプトコマンド次に

C:\Program File (x86)\Test> ScreenCapture "C:\\Users\Engrsky\Pictures\Screenshot.png ScreenCapture -l eng" 

私がしようとしたとき、それはsucessfully、しかし

ScreenCapture.txt

と呼ばれる出力ファイルを実行して書きます私が作ったexe(このファイル)を使って実行してください。私は出力を生成することができませんでした。

+2

おそらく.txtファイルがありますが、それを見つけることはできません。 (c:\ foo \ bar \ baz.txtの代わりにbaz.txtのような)ファイルの絶対パスを使用しないことから始まり、プログラムの作業ディレクトリを設定しないことによって悪化する問題の種類。 lpDirectoryを必ずC:/ Program File(x86)/ Testに設定してください。 –

+0

コメントありがとう、私はlpDirectoryを追加し、悲しいことに何も変更が発生しませんでした。プログラムがディレクトリに書き込まれないようにすることはできますか?すべてがUACの許可を得ていることを確認するために、管理者として実行するようにプログラム全体を設定する方法はありますか? – Engrsky

+0

文字列リテラルで正しくエスケープされていないスラッシュの束が表示されます。少なくともこれはコンパイラの警告を生成しませんか? – MrEricSir

答えて

0

ShellExecuteEx functionのMSDNドキュメントから、まずCOMを初期化する必要があります。使用する例:

CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); 
+0

この関数の使い方はわかりませんでしたが、 'auto str = etc etc 'の前にこの関数をコードの先頭に追加しましたが、変更はありません。 – Engrsky

+0

ここではいくつかのことを扱うことができます...その1つは64ビットと32ビットです。いくつかのコメントをここで読んでください:[管理者権限を必要とするアプリケーションを実行する方法](http://stackoverflow.com/questions/11586139/how-to-run-application-which-requires- –

+0

また、その 'SHELLEXECUTEINFO'構造のすべてのフィールドを正しく初期化する必要があります - [doc](https://msdn.microsoft.com/ja -us/library/windows/desktop/bb759784(v = vs.85).aspx)私はあなたが初期化しているよりも多くのフィールドを表示しています。 –

関連する問題