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と関連する良く見られている質問

QVC++6.0からVC++.NETへの変遷について

VC++がようやく分かり出したこの頃ですが、今日本屋に立ち寄ったら、なっ なんとVC++の本がほとんど無くなり、代わりにVC++.NETとVC#ばかりになっていました。

C#はVC++とは違うと聞いていたのですが、読んでみるとVC++.NETもかなり違ってました。
(かなり違うという表現は、各人の状況により意見が異なると思いますが)

私のような本を見ながらコードを打って勉強している初心者にとって、VC++.NETの本ではVC++6.0を動かすことができません。

今から勉強する人や本を買って勉強しようとしている人あるいは、コンパイラを手に入れようとしている人はVC++.NETに移行してしまわざるを得ないのでしょうか?

すでにVC++6.0を十分活用出来ている人も、時代の流れでNETやC#を勉強していかなければならないのでしょうか?

つまり、単なるバージョンアップとは一線をなす変更がなされたということなのでしょうか?

良くご存知の方見解をお願いします。

Aベストアンサー

すぐにではありませんが、.NETに移行せざるを得なくなるでしょうね。
ただ、開発環境という面では、VS.NETにはC++が含まれており、C++の部分は
従来のC++も利用できるようになっていて、これはアンマネージC++と呼ばれています。
C++で.NETのコードを作成する時は、マネージC++という拡張仕様で記述します。
また、従来のコードと.NETフレームワーク用コードを混在させてアプリケーションを
開発することもできます。これは、相互運用という形で説明されています。

ということですので、C++で習得したものが無駄になることはありません。
たぶん、.NET環境の開発には、C++よりもC#やVB.NETを利用することが
多くなると思いますが、C++を理解していることはプラスにはなってもマイナスには
なりませんので、頑張って下さい。

.NET関連のサイトを2つご紹介しておきます。ご参考に。
http://www.microsoft.com/japan/msdn/library/default.asp
http://www.atmarkit.co.jp/fdotnet/index.html

すぐにではありませんが、.NETに移行せざるを得なくなるでしょうね。
ただ、開発環境という面では、VS.NETにはC++が含まれており、C++の部分は
従来のC++も利用できるようになっていて、これはアンマネージC++と呼ばれています。
C++で.NETのコードを作成する時は、マネージC++という拡張仕様で記述します。
また、従来のコードと.NETフレームワーク用コードを混在させてアプリケーションを
開発することもできます。これは、相互運用という形で説明されています。

ということですので、C++で習得したもの...続きを読む

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

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

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

Aベストアンサー

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

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

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

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

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

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

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

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

QVC++とVC#の違いを教えて下さい

VC++とVC#どちらを勉強したほうが就職に有利でしょうか
VC++とVC#何がちがうのでしょうか。
VC++は主に業務系アプリを作成するときに使う言語で
VC#は主に制御系アプリを作るときに作成する見たいな
違いも教えて下さい。

Aベストアンサー

> VC++とVC#どちらを勉強したほうが就職に有利でしょうか

どちらでも大した差はないと思いますが、VC++の方が応用範囲は広くなると思います。VC++をVC#をという視点ではなく、プログラミング言語としてC/C++, C#を、プラットフォームとしてWindowsのプログラミングを、.NETフレームワークを、という視点で勉強することをお勧めします。

> VC++とVC#何がちがうのでしょうか。

VC++はC++をベースにしていますが、マイクロソフト社の独自仕様がかなり入っています。.NET Frameworkなしでも動くプログラムをかけます。一方、C#は比較的新しい言語で文法的にはJavaに似ており、.NET Frameworkを前提に作られています。

.NET Frameworkを使うのであれば、VC++, VB, C#のどれを使っても出来ることは一緒です。

私は、自分で使うちょっとしたツールを作る時は C#を使い、使用環境の制約上 .NET Frameworkが使えないものや、ドライバを開発する場合、サンプルプログラムとしてソースコードを開示する場合にはVC++を使っています。

ちなみに、マイコン上で動作する制御用プログラムを開発する場合はどちらも使えず、H8マイコンやSHマイコンではHEW(ルネサスの統合開発環境)にGCCやルネサスのC/C++コンパイラを使って、C言語でプログラムを開発しています。

> VC++とVC#どちらを勉強したほうが就職に有利でしょうか

どちらでも大した差はないと思いますが、VC++の方が応用範囲は広くなると思います。VC++をVC#をという視点ではなく、プログラミング言語としてC/C++, C#を、プラットフォームとしてWindowsのプログラミングを、.NETフレームワークを、という視点で勉強することをお勧めします。

> VC++とVC#何がちがうのでしょうか。

VC++はC++をベースにしていますが、マイクロソフト社の独自仕様がかなり入っています。.NET Frameworkなしでも動くプログラムを...続きを読む

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

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

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

Aベストアンサー

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

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

QVC++6で作成したDLLをVC++.NET2003から呼び出せますか

現在、VC++.NET2003で作成しています。あるメーカから提供されているDLLがあるのですが、そのDLLとのリンクまではできたのですが、実行するとエラーになってしまいます。
(プログラムが異常終了するのではないのですが、そのDLLからの戻り値がエラーになり、期待した結果が得られません。)
そのDLLはVC++6で作成したものらしく、マニュアルには、VC++6で作成したアプリケーションからの呼び出し方法が、記述されていました。
VC++6でアプリを作成すれば、正常に呼び出せることは明白なのですが、いかんせん、VC++.NET2003での開発が、ある程度進んでしまっていますので、いまからVC++6に切り替えるわけにもいきません。
それで、一般論として、確認したいのですが、VC++6で作成したDLLをVC++.NET2003で使用することは、出来ないのでしょうか。(これから、メーカにも確認する予定ですが、まずは、こちらで確認したく、投稿した次第です)

Aベストアンサー

> もし、原理的にVC++6のDLLをVC++.NETでも呼び出し可能なら、

呼び出すだけなら原理的には可能ですが、作り方次第では正しく動作しないと思います。
典型的なまずい例は、DLL側でmallocやnewなどで割付けたオブジェクトを呼び出し側で解放させる、またはその逆です。

結局のところ、DLLの作り方に強く依存しますので、想像だけではこれ以上分かりません。

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

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

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

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

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

Aベストアンサー

バグだったと思います。

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

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

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

QC#とVC++.NETについて教えて下さい。

質問タイトルが漠然としててごめんなさい。
特別なソフトを作る訳ではないのですが、暇プロレベルで最近やっと
苦労の末、.NET以前のVC++を理解できて、VC++ってMFC
を使う為の言語のだなーと思っている感じです。
C#は購入済みですが、まだ触ってません。VC++.NETは未購入
の状態です。

そこで質問なのですが、
 (1)WIN32アプリにはC#とVC++.NETどちらが適していますか?
 (2)VC++.NETはやはりMFC寄りの言語なのでしょうか?

インラインアセンブルとかもやりたいのですが、
 (3)VC++.NETではできますか?C#では?

C#は見た目がC言語でクラスも使えるのでVC++.NETとどう違う
のか良くわかりません。自分的にはC言語でなんでもやって行って、
C++はクラスが分かる程度で良しとしようと思っています。
詳しい方、漠然とした質問で申し訳ございませんが、ご教授お願いします。

Aベストアンサー

「VC++.NET」と書かれていますが
「Visual C++.NET 2003」及び「Visual C++.NET 2002」の事でしょうか?
2005からは「Visual C++ 2005」という表記になり表記から「.NET」ははずれました。
それと.NET Frameworkという言葉をご存知でしょうか?
C#は.NET Frameworkを使ったアプリケーションを作る為の言語です。

(1)
Win32APIを使ってプログラムをするなら普通VC++を使います。
C#はWin32APIの代わりに.NET Frameworkを使います。

(2)
従来通りMFCが使えます。(MFCのバージョンも上がっています。)
それとは別にC++から.NET Frameworkを使える
C++/CLIといものも選択できます。(2003ではマネージドC++と呼ばれていました)
(.NET Frameworkを使ったソフトを動かすには.NET Frameworkのランタイムが必要になります。)

(3)
VC++はインラインアセンブラを使うことが可能です。
C#はそんなに詳しくないですが多分無理です。
その代わりunsafeコード(インラインCみたいなもの)が使えます。

>C#は見た目がC言語でクラスも使えるのでVC++.NETとどう違う
>のか良くわかりません。
C#とC/C++はまったく違う言語です。例えばC#は基本的にポインタはありません。クラスの多重継承もできません。
単純なステートメント(文構造)が同じなだけです。
それならC++とJavaもステートメントは似ているといえます。

「VC++.NET」と書かれていますが
「Visual C++.NET 2003」及び「Visual C++.NET 2002」の事でしょうか?
2005からは「Visual C++ 2005」という表記になり表記から「.NET」ははずれました。
それと.NET Frameworkという言葉をご存知でしょうか?
C#は.NET Frameworkを使ったアプリケーションを作る為の言語です。

(1)
Win32APIを使ってプログラムをするなら普通VC++を使います。
C#はWin32APIの代わりに.NET Frameworkを使います。

(2)
従来通りMFCが使えます。(MFCのバージョンも上がっていま...続きを読む

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する方法みたいな話ですか?
もう少し具体的な質問でお願いできればと。。

QVC++プログラマーのアルバイトを未経験可、年齢不問で探しているのです

VC++プログラマーのアルバイトを未経験可、年齢不問で探しているのですが…
現在年齢は42歳です。
5~6年前からC言語を勉強し始め、現在はC++やVC++(MFC)を勉強するまでになったのですが、VC++プログラマーのアルバイトで雇ってくれる会社はありますか?
同じ未経験で入社するには若い人に比べて年齢でハンデがある分をスタートラインで差を付けようと思い、今でもVC++(MFC)の勉強を続けているのですがこれはあまり意味のないことですか?

Aベストアンサー

アルバイトということですが、どのような仕事をしたいのでしょうか?
単なるコーディングのみをやりたいのか、上流工程も含めた開発全体を経験したいのか質問内容からは読み取れません。
40代ということであれば、企業が求めるのは即戦力になる人ではないでしょうか?
プログラマーというよりは、システムエンジニアとして設計業務やマネジメントができる人が求められると思います。
仕事については、VC++(MFC)の開発業務の需要がどれだけあるかによると思います。
VC++にこだわるのであれば、VC++.netも挑戦したほうがアドバンテージがあると思います。
勉強しているから採用されると思っているなら、考えは甘いと思います。
企業は、どれだけVC++を使ってソフト開発を行ってきたかを見ると思います。
ここで質問するよりは、ハローワークや転職者向けの会社説明会などで質問したほうが良いと思います。

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ランキング