WindowsNT 4.0、VC++ 5.0 を使っています。

マルチプロセスに対応するDLLにおいて、DllMain()の
デタッチ(DLL_PROCESS_DETACH)処理で、「これが最後の
プロセスだ」と判断する方法はないでしょうか。
共有データとしてカウンタを持って、アタッチ、デタッチで
加減算しようと考えましたが、あるプロセスがアクセス違反などで
落ちたり、タスクマネージャなどから強制終了させられると
デタッチルーチンは動作しないので、駄目だと気付きました。

何かいい方法などがありましたら、ご教授願います。

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

A 回答 (1件)

こんにちは、honiyonです。



 あまり詳しくない分野なのでアテにならないかも知れないですが、
 アタッチ時に Window HandleやWindow名等を渡してもらうようにして、任意のタイミング、もしくはデタッチ時にアタッチしているソフトがまだ起動されているか、を判断してみてはいかがでしょう?

 試してないのでこの方法が使えるかは分かりません(^^;
 参考になれば幸いです(..
    • good
    • 0
この回答へのお礼

アドバイスありがとうございました。
アタッチ時にPIDを取得して、テーブル管理して、
デタッチ時にテーブル内のプロセスの存在チェックを
行って対応しようと思います。

お礼日時:2001/11/07 11:59

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

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

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

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

Qデバックにプロセスをアタッチについて

デバックにプロセスをアタッチについては、どういうこと
ですか?
また、VS2005の環境で、どうすれば、使えますか?

以上です。よろしくお願いします。

Aベストアンサー

「プロセスにアタッチ」とは「指定したプロセスをデバッグする」と言う意味です。

言い方を変えれば「デバッグ対象のプロセスを変える」と言うこと。

具体的な使い方は、例えば、現在デバッグしている「プロセスA」から、子プロセス呼び出しで「プロセスB」を呼び、プロセスBの実行結果を待つ、としましょう。

その際に「プロセスBから返って来る実行結果が変」だと気付いた時、プロセスBで何が起きているか知る為に、プロセスBをデバッグ対象に切り替えたくなります。

そこで使用するのが「プロセスのアタッチ」です。

>また、VS2005の環境で、どうすれば、使えますか?

OSの種類、CPUの種類によって、VS2005の環境で使えたり使えなかったりします。

デバッガのメニューで「プロセスにアタッチ」が非アクティブで選択不可能な時は、その実行環境では、デバッグ対象プロセスを切り替え出来ません。

QVC++6の「プロセスへアタッチ」について

VC++6(MFC無し)で作成したEXEを「プロセスへアタッチ」でデバッグをしたいのですが、通常のデバッグ実行時と同じようにソースを参照しながらのデバッグはできないのでしょうか?

現在、プロセスへアタッチを行うと新たにワークスペースは作成され、ソースがない状態でデバッグ中となってしまいます。

Aベストアンサー

ソースレベルのデバッグも可能です
何か特定のアクションを起こした際に実行されるコードに
# たとえば WndProcのWM_LBUTTONDOWNなど
_asm{ int 3 }
を埋め込んでみましょう
ここへ到達した際に VC6のIDEがソースを表示してくれると思います

ただし、ソースを手直しして再コンパイル&実行はこの手法では無理だと思います
再コンパイルが必要ならばワークスペース(DSW)から起動した方がいいでしょう
EXEファイルには プロジェクト設定までは盛り込まれていないので

QVC++6.0 「プロセスへアタッチ」でのデバッグについて

VC++6.0(SP3)を使っています。
プロセスにアタッチしてデバッグする方法があります。

・「ビルド」→「デバッグの開始」→「プロセスへアタッチ」

通常、この方法で現在動作しているプロセスの一覧が表示されるはずなのですが、
全く表示されなくて困っています。

原因、アドバイスなど、何かご存知の方がいればご教授願います。

Aベストアンサー

バグだったと思います。

タスクマネージャからプロセスを選んで
右クリック→デバッグで同様のことが出来ます。

SP4でも解決するみたいですね。

参考URL:http://www.microsoft.com/JAPAN/support/kb/articles/J053/4/91.htm

Q作成したDLLをATL_COM_APPWIZARDで利用する方法について

VC6++のWin32 Dynamic Link LibraryでDLLを作成しました。
DLLはできたのですが、これを利用する方法がわかりません。

ATL COM AppWizardで作成するアプリからDLLのクラスを使いたいのですが、どのようにすれば使えるのでしょうか?

最初のDLL側は
class Test{
Test(){
ShowMessageBox(NULL, "最初のDLL", "呼ばれました", MB_OK);
}
};

というクラスです。

ATL COM Appwizardでは、
どのように記述すれば、DLLのクラスを利用することができるのでしょうか?

Aベストアンサー

DLLを作成しながら利用方法がわからないって、、いったいどうやって
作ったんでしょ^^;^^;

VC6でATLを使うのは、非常にめんどいです。
内容を技術的に把握してないと、まず、つかえません。
また、『DLLのクラスを利用』と記述していますが、
そもそもCOMのDLLはそのような使い方をするものではありません。

普通のCOMでないDLLで、クラスをexportする方法みたいな話ですか?
もう少し具体的な質問でお願いできればと。。

Qpthread_cond_waitとptherad_cond_signal

pthread_cond_waitで寝ているthreadに対して、ptherad_cond_signalにて起こして、そのthreadが再度寝るまでの間にpthread_cond_signalが複数回(2回として)Callされた場合、どのような挙動になるのでしょうか?

最初のSignalをA、以下B,Cとすると
A->cond_wait->B->cond_wait->C
となるのでしょうか?

宜しくお願い致します。

Aベストアンサー

>waitしていたthreadが稼動している状態でのsignal発行は空振りに終わるということでしょうか?
その通りです。
ptherad_cond_signalが発行されたとき、pthread_cond_waitで待機しているスレッドがなければ、そのシグナルは無視されます。
参考までに下記の実験結果を参照下さい。(空白は全角にしてます)
ソースプログラム
-------------------------------------------
#include  <stdio.h>
#include  <stdlib.h>
#include  <pthread.h>
#include  <time.h>
pthread_mutex_t mut_sub_print = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mut_sub_th = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond_sub_th = PTHREAD_COND_INITIALIZER;
int main_sleep_time;
int sub_sleep_time;

void  sub_print(char *name,char *msg,int ctr)
{
  pthread_mutex_lock(&mut_sub_print);
  printf("%s:%s(%d)\n",name,msg,ctr);
  fflush(stdout);
  pthread_mutex_unlock(&mut_sub_print);
}
void  *sub_thread(void *adddr)
{
  int   ctr = 0;
  pthread_mutex_lock(&mut_sub_th);
  while(1){
    pthread_cond_wait(&cond_sub_th,&mut_sub_th);
    ctr++;
    sub_print("sub","con_wait終了",ctr);
    usleep(sub_sleep_time*1000);
  }
  return NULL;
}
// 第1パラメータにメインスレッドのスリープ時間(ミリ秒)
// 第2パラメータにサブスレッドのスリープ時間(ミリ秒)
int main(int argc,char **argv)
{
  int ret;
  int i;
  int ctr = 0;
  pthread_t  tid;
  if (argc != 3){
    printf("%s P1 P2\n",argv[0]);
    printf("P1:メインスレッドのスリープ時間(ミリ秒)\n");
    printf("P2:サブスレッドのスリープ時間(ミリ秒)\n");
    exit(1);
  }
  main_sleep_time = atoi(argv[1]);
  sub_sleep_time = atoi(argv[2]);
  printf("メインスリープ時間=%dミリ秒\n",main_sleep_time);
  printf("サブスリープ時間=%dミリ秒\n",sub_sleep_time);
  ret = pthread_create(&tid,NULL,sub_thread,NULL);
  if (ret != 0){
    printf("pthread_create error:%d\n",ret);
    exit(1);
  }
  usleep(1000);  //1ミリ停止
  for (i = 0; i < 10; i++){
    ctr++;
    pthread_cond_signal(&cond_sub_th);
    sub_print("main","cond_signal完了",ctr);
    usleep(main_sleep_time*1000);
  }
  sleep(10);
  sub_print("main","スレッド停止",0);
  exit(0);
}
---------------------------------------------
第一引数にメインスレッドのスリープ時間
第二引数にサブスレッドのスリープ時間を指定します。
メインスレッド側で、スリープ時間を大きくとり、ゆっくりと
cond_signalを発行すると、空振りが起こりにくくなります。
逆にメインスレッド側で、スリープ時間を小さく取り、
cond_signalを速射すると、空振りが起こりやすくなります。
以下、実行結果。
メインスレッド:300ミリのスリープ
サブスレッド:100ミリのスリープの場合
cond_signal 300 100
メインスリープ時間=300ミリ秒
サブスリープ時間=100ミリ秒
main:cond_signal完了(1)
sub:con_wait終了(1)
main:cond_signal完了(2)
sub:con_wait終了(2)
main:cond_signal完了(3)
sub:con_wait終了(3)
main:cond_signal完了(4)
sub:con_wait終了(4)
main:cond_signal完了(5)
sub:con_wait終了(5)
main:cond_signal完了(6)
sub:con_wait終了(6)
main:cond_signal完了(7)
sub:con_wait終了(7)
main:cond_signal完了(8)
sub:con_wait終了(8)
main:cond_signal完了(9)
sub:con_wait終了(9)
main:cond_signal完了(10)
sub:con_wait終了(10)
main:スレッド停止(0)

メインスレッド:100ミリのスリープ
サブスレッド:300ミリのスリープの場合
cond_signal 100 300
メインスリープ時間=100ミリ秒
サブスリープ時間=300ミリ秒
main:cond_signal完了(1)
sub:con_wait終了(1)
main:cond_signal完了(2)
main:cond_signal完了(3)
main:cond_signal完了(4)
sub:con_wait終了(2)
main:cond_signal完了(5)
main:cond_signal完了(6)
main:cond_signal完了(7)
sub:con_wait終了(3)
main:cond_signal完了(8)
main:cond_signal完了(9)
main:cond_signal完了(10)
sub:con_wait終了(4)
main:スレッド停止(0)

>waitしていたthreadが稼動している状態でのsignal発行は空振りに終わるということでしょうか?
その通りです。
ptherad_cond_signalが発行されたとき、pthread_cond_waitで待機しているスレッドがなければ、そのシグナルは無視されます。
参考までに下記の実験結果を参照下さい。(空白は全角にしてます)
ソースプログラム
-------------------------------------------
#include  <stdio.h>
#include  <stdlib.h>
#include  <pthread.h>
#include  <time.h>
pthread_mutex_t mut_sub_print =...続きを読む


人気Q&Aランキング

おすすめ情報