VC++6.0においてShellExecuteでDOS窓をたち上げてコマンドを
実行したいのですが、うまくいきません。

1.ShellExecute(m_hWnd,"open","command.com","dir",NULL,SW_SHOW);
...とすると”指定された COMMAND 検索ディレクトリが違います.”となり、
なにも実行されません。

2.ShellExecute(m_hWnd,"open","command.com","dir /?",NULL,SW_SHOW);
...とするとちゃんとdirのヘルプが表示されますが、すぐに窓が閉じます。

3.ShellExecute(m_hWnd,"open","command.com","dir /? > out.txt",NULL,SW_SHOW);
...としてもファイルが作られず、2.と全く同じ結果になってしまいます。

これはどうしてこのような現象が起きるのでしょうか?
DOSプロンプトをたち上げて同様なコマンドを実行した場合はちゃんと期待通りの結果が得られます。
あと、DOS窓が閉じないようにするにはどうすればいいのでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (4件)

3.の部分について。


VBで似たような事をしたときのことですが。

「COMMAND/C DIR > C:\DIR.TXT」とやら無いと
リダイレクトの結果が残せませんでした。

参考になりましたら。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
ご指摘の通りdirの前に /Kやら/Cやらオプションを付けると
それだけで1も2も3も全てうまくいくようです(ナゼだ???)

結局良く分からないので、ShellExecute()は止めて、system()関数(VBにもあるのかな?)を使うようにしました。

ありがとうございました。

お礼日時:2001/07/12 09:35

command.comのオプションをご覧ください。

Windows NT/2000の場合は
cmd.exeをお使いになることをお勧めします。command.comで実現されて
いるコマンドを実行させるためには/cスイッチを使います。

ShellExecute(handle, "Open"
         , "command.com"
, "/c dir /? > out.txt"
            , SW_SHOW);


としてみてください。
    • good
    • 0

「チャイルドプロセス」がキーワードとなるような話を思い出しました。



DIRはDOSの内部コマンドで実行するのはcommand.comです。
リダイレクトで結果保存するのもcommand.comであるため
表示するための領域が必要なのでしょう。

DOSのバッチ処理を作成する際、「複数のバッチ処理を呼ぶバッチ」を実現する
ために必要でした。(今は Callが使えるから)
    • good
    • 0

DOS窓を閉じないようにするには、command.comに/kオプションを付けて


起動すればOKです。↓こんな感じです。
 ShellExecute(hWnd, "open", "command.com", "/k dir", NULL, SW_SHOWNORMAL);
(WinNT/2Kはcmd.exeを起動したほうが良いと思います)

1~3の現象について何故そうなるかはよくわかりませんが、おそらく
command.comの起動オプションの書式エラーになっているだけだと思います。
DOS窓で command.com /? としてヘルプを見ると、
 COMMAND [[ドライブ:]パス] [デバイス] ...
のようになっていますが、"dir"文字列がドライブ、パスとして認識されて
いるのかもしれません。
2.についても、dirコマンドのヘルプではなく、command.comのヘルプが
表示されているはずです。
(3.のファイルに出力されない理由はわかりません)
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
/K オプション COMMAND.COMのヘルプにありましたね。回答を頂いて気づきました。(^^;)
そこで色々試してみたのですが、 dirの前に /Kやら/Cやらオプションを付けると
それだけで1も2も3も全てうまくいくようです(ナゼだ???)

結局良く分からないので、ShellExecute()は止めて、system()関数を使うようにしました。

ありがとうございました。

お礼日時:2001/07/12 09:26

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QhDC=::GetDC(m_hWnd)とhDC=GetDC(m_hWn

hDC=::GetDC(m_hWnd)とhDC=GetDC(m_hWnd)の違いについて

表題について,お伺いします。
ビットマップをダイアログに表示するソースコードを
書いてますが,参考書やさまざまなHPでは,
ウィンドウハンドルをゲットする際に

hDC=::GetDC(m_hWnd) ○
↑と書かれております。

hDC=GetDC(m_hWnd)  ×
↑はなぜだめなのでしょう。

 ●このスコープ演算子::は何の為につけているのですか?

::が無いとエラーになるので必要みたいですが・・

Aベストアンサー

どういうエラー(リンクエラー、コンパイルエラー)なのかがわからないので、
あくまで憶測ですが、
Windows.hで定義されているGetDC()の他に、
別のスコープに(例えばクラスのメソッドとして)、
GetDC()が定義されているのではないでしょうか?

上記の状態でスコープ演算子がないときには、
同じクラス(スコープ)にあるGetDC()を先に呼ぶことになるので、
目的のWindows.hのGetDC()を呼ぶことができないのだと思います。

参考URL:http://wisdom.sakura.ne.jp/programming/cpp/cpp7.html

Qint select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)について

見当違いな質問かもしれませんがお願いします。

複数のソケットを監視する際にselectを使う場合のことですが、
selectの動作と戻り値について疑問があります。

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/select.2.html
ここを参照すると、selectの戻り値は
「更新された 3 つのディスクリプタ集合に含まれているディスクリプタの数 (つまり、 readfds, writefds, exceptfds 中の 1 になっているビットの総数) を返す。」
とあります。
私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識だとreadfds,writefdsが引数として与えられているとしても、
どちらかのfd_setのうち、一つでも動きがあればselect文は
抜けてしまうことになります。とすると、戻り値として
「readfds, writefds, exceptfds 中の 1 になっているビットの総数」
は常に1ということになってしまいます。しかし、総数というからには
複数同時に1になることもあるはずです。

私の認識が間違っているとは思うのですが、どう間違っているのかわかりません。
select文の動きについて詳しく教えていただけないでしょうか。
または良いページがあれば教えてください。

見当違いな質問かもしれませんがお願いします。

複数のソケットを監視する際にselectを使う場合のことですが、
selectの動作と戻り値について疑問があります。

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/select.2.html
ここを参照すると、selectの戻り値は
「更新された 3 つのディスクリプタ集合に含まれているディスクリプタの数 (つまり、 readfds, writefds, exceptfds 中の 1 になっているビットの総数) を返す。」
とあります。
私の中でselectは登録してあるFDのうち、一つでも動きが...続きを読む

Aベストアンサー

>私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識はあっています。
しかし、selectを呼び出す以前にOKになっているFDがあれば、それらは全てビットがONになります。

話しを簡単にする為に、受信のみのソケットを3つ作成したとします。
これらの3つのソケットに向けて相手が電文を送ったとします。
その状態でまだ、こちらはselectを呼び出さずにいます。しばらくしてから、selectを呼び出すと、selectは即座にリターンし、3つのビットが一度にONになっているはずです。
一方、相手が、一切電文を送ってない状態で、selectを呼び出した場合は、何れかのビットがONになればリターンするので、そのときは、貴方が想像しているように
ビットの総数は1になる可能性が高いです。
従って、相手が電文を送る前にselectを呼び出すか、送った後にselectを呼び出すかは、その時のタイミングにより異なります。従って、ビット数の総和が常に1であるとは、考えない方が無難です。(1つのソケットしか使用しない場合は別ですが・・・)

>私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識はあっています。
しかし、selectを呼び出す以前にOKになっているFDがあれば、それらは全てビットがONになります。

話しを簡単にする為に、受信のみのソケットを3つ作成したとします。
これらの3つのソケットに向けて相手が電文を送ったとします。
その状態でまだ、こちらはselectを呼び出さずにいます。しばらくしてから、selectを呼び出すと、selectは即座にリターンし、3つのビ...続きを読む

QなぜhButton1ボタンからのWM_COMMANDはフックできてクライアントエリアのWM_RBUTTONDOWNはフックできないのでしょうか?

#define STRLBUTTON TEXT("マウス左ボタンが押されました from mainProc")
#define STRRBUTTON TEXT("マウス右ボタンが押されました from my_HookProc")
#define STRCOMMAND TEXT("ボタンが押されました")


HWND hButton1;



LRESULT CALLBACK my_HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
CWPRETSTRUCT *pcwpRetStruct = (CWPRETSTRUCT *)lParam;
HDC hDC;

if(nCode==HC_ACTION)
{
hDC = GetDC(pcwpRetStruct->hwnd);
switch(pcwpRetStruct->message)
{
case WM_COMMAND:
TextOut(hDC, 10, 10, STRCOMMAND, strlen(STRCOMMAND));
break;
case WM_RBUTTONDOWN:
TextOut(hDC, 10, 10, STRRBUTTON, strlen(STRRBUTTON));
break;
}

ReleaseDC(pcwpRetStruct->hwnd, hDC);
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}



LRESULT CALLBACK mainProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static HHOOK hHook;
HDC hDC;

switch(uMsg)
{
case WM_DESTROY:
UnhookWindowsHookEx(hHook);
PostQuitMessage(0);
return 0;

case WM_CREATE:
hHook = SetWindowsHookEx(WH_CALLWNDPROCRET, my_HookProc, NULL, GetCurrentThreadId() );
if(!hHook)
MessageBox(NULL, "hooking failed", NULL, MB_OK);

hButton1 = CreateWindow(
"BUTTON", "hButton1",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
10, 40, 100, 20,
hWnd, NULL,
((LPCREATESTRUCT)lParam)->hInstance, NULL
);
return 0;

case WM_LBUTTONDOWN:
hDC = GetDC(hWnd);
TextOut(hDC, 10, 10, STRLBUTTON, strlen(STRLBUTTON));
ReleaseDC(hWnd, hDC);
return 0;
}

return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

#define STRLBUTTON TEXT("マウス左ボタンが押されました from mainProc")
#define STRRBUTTON TEXT("マウス右ボタンが押されました from my_HookProc")
#define STRCOMMAND TEXT("ボタンが押されました")


HWND hButton1;



LRESULT CALLBACK my_HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
CWPRETSTRUCT *pcwpRetStruct = (CWPRETSTRUCT *)lParam;
HDC hDC;

if(nCode==HC_ACTION)
{
hDC = GetDC(pcwpRetStruct->hwnd);
switch(pcwpRetStruct->message)
{
case WM_COMMAND:
Tex...続きを読む

Aベストアンサー

WH_CALLWNDPROCRETはSendMessageで送られたメッセージのみを対象とし、WM_xBUTTONDOWNはPostMessageで送られるからです。WH_GETMESSAGEならばWM_xBUTTONDOWNをフックすることができます。

QSendMessage(hW,WM_CREATE,0,0);を

SendMessage(hW,WM_CREATE,0,0);
を実行するとシステムがWM_DOWNやWM_CHARを発行しなくなるみたいです
というのはそれ以降キー入力を無視するようになるのです
いったんアプリをアイコン化してウィンドウ化するとWM_DOWNやWM_CHARを発行するようになります
WM_CREATEを送ってもWM_DOWNやWM_CHARを発行しなくなるのを阻止するために何か方法はないでしょうか?

Aベストアンサー

>プログラムのイニシャライズのために送ったのですが送らないで住むプログラムに変更しました

普通はそんな方法はとりません。
システムが何をするか分からないからです。

自分でメッセージを定義して、初期化処理を行うようするためのメッセージを送るほうが無難です。
WM_CREATEと同じ処理を初期化処理として行わせたいのであれば、初期化処理を関数化して自分で定義したメッセージでも呼び出せばいいのですし。


>作ったプッシュボタンを押してシステムがWM_COMMANDを送ってきた後キー関係のメッセージを送ってくれなくなります

プッシュボタンがキーボードフォーカスを持ってのるでは?

ボタンがキーボードフォーカスを持っていてもキー関連のメッセージを親ウィンドウが受け取りたいのであれば、サブクラス化をするしかないでしょう。

Q_variant_t型のNULLチェック

ADOでAccess2000のテーブルを読み込もうとしていますが、空のフィールドを読み込んだときにエラーになります。

FieldPtrpfName;
_variant_t vName;
CString strwk;
 :
 :
pfName = pRs->Fields->GetItem("名前");
vName.Clear();
vName = pfName->Value;
strwk = vName.bstrVal;

名前が空の場合、このstrwkをリストビューに表示させようとするとエラーになります。

ウォッチウィンドウで見ると{VT_NULL}と表示されますが、
if (vName == VT_NULL)
とすると、コンパイルで、「あいまいです」とエラーになります。

フィールドが空かどうかの判断の方法を教えてください。

Aベストアンサー

if (vName == VT_NULL)

if (vName.vt == VT_NULL)
としてみたらどうでしょう?


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報