ひろと申します。
クライアントからサーバの共有フォルダにある、他のアプリケーションを
オプション付きで起動させるプログラムをVC++で作成したのですが、
クライアントがNTだとうまくいきません。
たとえば、サーバ上にあるapp.exeを「app.exe /i」のような感じで
起動すると、クライアントがwin98の場合はアプリケーションが
表示されるのですが、NTから起動させようとすると、
アプリケーションは表示されません。
また、オプションを外すとアプリケーションは NTでも表示されます。
APIは、WinExec,ShellExecuteEx,CreateProcessで試したのですが
同じ結果でした。
CreateProcess は以下のように設定してます。
------------------------------------------------------------------
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(STARTUPINFO));
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOWNORMAL;
CreateProcess(NULL, "serverpath\\app.exe /i", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);

プロセスの起動は成功していうようです。
クライアントがNTの場合、他に必要な設定があるのでしょうか?
よろしくお願いします。

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

A 回答 (1件)

Windows98 で OK で、WindowsNT で駄目、ということであれば、権限周りを


疑いたくなりますが、オプションの指定を外すと、NT でも OK ってのが
良く分かりませんね。

> プロセスの起動は成功していうようです。

というのは、CreateProcess() の戻り値を確認した、ということでしょうか?

もし、確認していないのであれば、確認しましょう。もし FALSE で返っている
ようであれば、GetLastError() でエラー番号を調べましょう。

もし TRUE で返っているようであれば、どうしましょうか。とりあえずは、
タスクマネージャーで、プロセスが起動されてウィンドウが表示されていない
のか、プロセス自体いない(起動された直後に終了している可能性を疑う)のか
を確認してみるところから、問題を切り分けるのかなあ…
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
a-kumaさんの回答を参考に調べてみたところ、
どうやら、起動アプリ側の不具合のようでした。
大変、ご迷惑をおかけしました。ありがとうございました。

お礼日時:2001/10/03 18:03

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

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

Qfgets((char*)&rbof,sizeof(ADR),fp) != NULL )

第2種情報処理技術者試験 平成7年春 午後 問7
http://www.bohyoh.com/ITEE/C/1995A07.html


中盤の
「while (fgets( (char*)&rbuf , sizeof(ADR), fp )!= NULL ) 」
が読めません

(char*)&rbuf , sizeof(ADR), fp
ファイルポインタからsizeof(ADR)サイズの分だけ取り出した文字を変数(char*)&rbufにほおりこむ

これが自分なりの解釈です
ですが「(char*)&rbuf」が意味不明。。。


根本的に解釈が間違っているのだと思います


詳しくわかる方教えてください

Aベストアンサー

rbufはADR型の構造体です。

&rbufは、ADR型の構造体rbufの実体へのポインタです。

つまり「&rbuf」は「(ADR *)&rbuf」です。

fgetsの引数は「char *」「size_t」「FILE *」ですから
fgets(&rbuf,sizeof(ADR),fp)
と書くと「char *」であるべき引数に「ADR *」を渡す事になります。

すると、コンパイラは「なにしてんねん。fgetsの1番目の引数はchar *やねんで。ADR *を渡されても困るねん」って言って、エラーになります。

なので「&rbufはADR *じゃなくて、char *だと思ってくれ」と書く必要があります。それが「(char *)&rbuf」と言う書き方です。

これを「型キャスト」と言います。

以下の例を参考に、考えてみて下さい。

typedef struct {
  (略)
} ADR;
(略)
  union PTR {
    char *char_ptr;
    ADR *adr_ptr;
  } ptr;
  ADR rbuf;
(略)
  ptr.adr_ptr = &rbuf;
(略)
  fgets(ptr.char_ptr,sizeof(ADR),fp);

この例は、ADR *とchar *を共有する共用体「ptr」を使用し「rbufのポインタ」を「ADR *型のadr_ptr」で受け取り、そのポインタを「char *型のchar_ptr」で参照しています。

つまり「型キャストを使用しないで書くと、上記のように共用体を使うなど、面倒な事をしなきゃなんない」のです。

これが、型キャストを使えば、
typedef struct {
  (略)
} ADR;
(略)
  ADR rbuf;
  fgets((char *)&rbuf,sizeof(ADR),fp);
だけで済んじゃうのです。

rbufはADR型の構造体です。

&rbufは、ADR型の構造体rbufの実体へのポインタです。

つまり「&rbuf」は「(ADR *)&rbuf」です。

fgetsの引数は「char *」「size_t」「FILE *」ですから
fgets(&rbuf,sizeof(ADR),fp)
と書くと「char *」であるべき引数に「ADR *」を渡す事になります。

すると、コンパイラは「なにしてんねん。fgetsの1番目の引数はchar *やねんで。ADR *を渡されても困るねん」って言って、エラーになります。

なので「&rbufはADR *じゃなくて、char *だと思ってくれ」と書く必要が...続きを読む

Qsizeof(long), sizeof(short)   (処理系依存と言うけれど・・・)

 
数値(整数)型の定義サイズについて、質問です。

ANSIの規格では、

sizeof(short) ≦ sizeof(int) ≦ sizeof(long)

としか定義されていないので、実際にこれらの型が取る大きさは処理系依存だ、と聞きます。
しかし、VC++、BCCなど、知名度の高いコンパイラでは、いずれも、

sizeof(short) → 2
sizeof(int) → 2
sizeof(long) → 4

となっているようです。(手元にないので、gccでは確認していませんが・・・)
実際のところ、上記のサイズにならない処理系は実在するのでしょうか?

何故こんな質問をするのかというと、あるテキスト(事情があって、書名等の情報は出せないのですが)に

> 次の sizeof 演算子の返す値として正しいものはどれですか。
>
> long hoge[32];
> sizeof(hoge);
> ------------------------------------------------------
> A. 32
> B. 64
> C. 128
> D. 256
> E. 512

という問題が掲載されており、解説が、

> 正解は C 。
>
> long 型は 4 バイトで構成されるので、32 個の要素がある配列では、 128 バイトになります。

となっていたのです。(short型のサイズを問う類題あり)
特定の処理系が前提条件とされていないので、適切な設問、解説とは思えないのですが、誤りと断言できるほどの自信がないため、作者に指摘すべきか否か、迷っています。
sizeof(short) → 2、sizeof(long) → 4 にならない処理系が実在しなければ、規格の定義上は正しくなくても、実務上は誤りとは言えないような気もしますが、どうでしょうか?
コメントをお待ちしております。
 

 
数値(整数)型の定義サイズについて、質問です。

ANSIの規格では、

sizeof(short) ≦ sizeof(int) ≦ sizeof(long)

としか定義されていないので、実際にこれらの型が取る大きさは処理系依存だ、と聞きます。
しかし、VC++、BCCなど、知名度の高いコンパイラでは、いずれも、

sizeof(short) → 2
sizeof(int) → 2
sizeof(long) → 4

となっているようです。(手元にないので、gccでは確認していませんが・・・)
実際のところ、上記のサイズにならない処理系は実在するのでしょうか?

何故...続きを読む

Aベストアンサー

64ビットマシン向けの商用UNIXのほとんどでは、
sizeof(long)は 8
となっているはずです。(LP64モデルを採用)

ちなみに、
Win64では 4 のままです。(LLP64モデルを採用)

さらに重箱の隅をつつくようで申し訳ないですが、IA32向けのVC++や、BCCでは、sizeof(int)は 2 ではなく 4 を返しますね。ご確認を。

参考まで。

Qint i,j; \n i=0,j=5;

int i,j;
i=0;
j=5:
と書いてあるソースは普通ですが、
int i,j;
i=0,j=5:
と書いてあるソースもあります。
後者はC++の正しい書式ですか?

カンマ演算子というのは後者のカンマのことですか?

Aベストアンサー

 正しい書式です。

i=0,j=5;
 における、「,」をカンマ演算子といいます。2項の演算子です。カンマで区切られた演算を「左から順番に」実行し、最後の演算を結果として返します。
 したがって、例の文であれば、i=0を実行し、次にj=5を実行。そして、j=5の結果の5を結果として返します。
 ・・・
 が、本来的には、あまり、例のような使い方はしませんね。よく見られるのは、次のような場合です。

 for (i=0,j=0 ; i < 50 ; ++i,++j) {

 のような形でよく見られます。for文の各式は、一つの式でなければならないので、こんな書き方をするわけです。初期化と更新部が一つにまとまり、ループが読みやすくなるのが利点かな。

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を送ってきた後キー関係のメッセージを送ってくれなくなります

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

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

Q1,1,2,3,5,8,13の合計

初心者ですみませんが、1,1,2,3,5,8,13の合計を出すプログラミングがどうしてもわかりません。どなたかご教示頂けましたら助かります。
宜しくお願いいたします。

Aベストアンサー

#include <stdio.h>

int main(void)
{
   printf("%d\n", 1+1+2+3+5+8+13);
}


人気Q&Aランキング

おすすめ情報