• ベストアンサー

DLLにおいて、最後のプロセスデタッチだと判断する方法

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

質問者が選んだベストアンサー

  • ベストアンサー
  • honiyon
  • ベストアンサー率37% (331/872)
回答No.1

こんにちは、honiyonです。  あまり詳しくない分野なのでアテにならないかも知れないですが、  アタッチ時に Window HandleやWindow名等を渡してもらうようにして、任意のタイミング、もしくはデタッチ時にアタッチしているソフトがまだ起動されているか、を判断してみてはいかがでしょう?  試してないのでこの方法が使えるかは分かりません(^^;  参考になれば幸いです(..

nabezo-
質問者

お礼

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

関連するQ&A

  • EXE1→DLL→EXE2数値を受け渡す方法

    C++プログラムの初級者です。 EXE1の数値をDLLの関数Func1に渡し、そこで計算した結果を関数Func2でEXE2に送るプログラムを作成しています。 下記のようなDLLのコードを作成したのですが、うまく数値を受け渡すことが出来ません。 調べてみると、EXE1⇔DLLとEXE2⇔DLLとは、アドレス空間が別なので、DLLのStatic変数を共有できないようです。 EXE1⇔DLL と EXE2⇔DLL の1対1では数値受け渡しは、正常に動作しています。 具体的に、DLLにどのようなコードを書けば、数値を受け渡すことができるのでしょうか? ご指導よろしくお願いします。 VC++2010ExpressEdition で作成しています。 <DLLのソースコード> ---------------------- #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <stdlib.h> #include <stdio.h> #include <iostream> static double aa, bb; __declspec(dllexport) double __stdcall Func1(double a1, double b1) { aa = a1*2; return (double)(aa); } __declspec(dllexport) double __stdcall Func2(double a2, double b2) { return (double)(aa); } BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) { //---- switch(ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } //---- return(TRUE); }

  • VisualStudio2005でのDLL作成

    開発環境 OS:WindowsXP SP2 SDK:VisualStudio2005 StandardEdition 言語:VC++ Win32コンソールアプリケーションのDLLを選択 空のプロジェクトを使用 作成したいのはVBなどから呼び出せるWin32DLLです。 他のホームページを参考にして以下のようなファイルを作成し ビルド->コンパイルしたところdllファイルはできましたが AccessVBAから参照設定ができませんでした。 どこを修正すればよいか教えてください。 <dlltest.cpp> #define EX __declspec (dllexport) #include <iostream> #include <windows.h> EX int fnWindowHook(void); BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call){ case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } EX int hundred(){ return 100; } <dlltest.def> LIBRARY "dlltest1" EXPORTS disp @1

  • DLLが LoadLibrary() でロードされたか判断できますか

    VC++6.0でDLLを作成しています。 アプリケーションが自分のDLLを LoadLibrary()でロードしたのか、 LIBリンクでロードしたのか、判断はできるでしょうか。 DLLの処理の中で、LoadLibrary()でロードされた場合と LIBリンクでロードされた場合の処理を分けたいのが目的です。 (LIBリンクの場合、デタッチ時にはメインのスレッドしか動作しないため) <補足> 正式にはどう呼ばれているか解らないのですが、「LIBリンク」は VCの設定でリンクするLIBを指定し、アプリケーションでは DLLが提供する関数名を記述する方法を意味します。

  • VC++アプリケーションフォームにDLLをリンク

    単純なC++などは適当に使えるのですが、マルチスレッドのプログラムについては初心者です。 VC++2010ExpressEditionのアプリケーションフォームを用いて ボタンを押すと、テキストに入力した数値をDLLの関数に送り、その計算結果を、ラベルに表示する、という単純なプログラムを作成しています。 DLLを利用しないで、Form1内に計算式を作った場合には、正常に動かすことができます。 しかし、DLLの関数を利用する方法がわかりません。 DLLを呼び出すようにプログラムを書いても、ビルドするとエラーが出ます。 インターネット上を30時間位いろいろ調べて試したのですが、分かりませんでした。 もう限界になりましたので、ここに投稿しました。 解決方法を教えて頂けますよう、お願い致します。 DLLは下記のような単純なもので、Sample.cppとSample.defで構成されています。 //+--- Sample.cpp ---+ #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #include <windows.h> #include <stdlib.h> #include <stdio.h> //---- #define ABC_EXPFUNC __declspec(dllexport) //+------------------------------------------------------------------+ BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) { //---- switch(ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } //---- return(TRUE); } //+------------------------------------------------------------------+ ABC_EXPFUNC double __stdcall SecretFunc(double a, double b) { double c = a + b; return(c); } //+--- Sample.def ---+ LIBRARY Sample EXPORTS SecretFunc

  • 16ビットDLLから32ビットDLLをコールする方法

    現在VC++で「16ビットDLLから32ビットDLLをコール」をしようと思って 調べていましたが、このご質問に頼るしか方法がなく、困っています。 状況  VB4.0(16bit)・・・16bit版でEXEを作成  VC++1.51・・・・・16bitDLLを作成  VC++4.0/6.0・・・・32bitDLLを作成  VB4.0(16bit)のEXEから、16bit版のDLLをコールし処理を行いたいの  ですが、16bit版DLLで扱えないVC++の関数(プロセス関数:spawn??())  を利用しなければならず、16bit版DLLの機能を32bit版DLLで作成し、  16bit版DLLから32bit版DLLを呼び出そうと思っております。 誰か助けて! 是非、皆様のお知恵を拝借致したく思います。

  • NTでのプロセス出力

    こんにちは。 WindowsNT4.0で、タスクマネージャのプロセス (稼動しているプロセス)を、 テキストにリダイレクト出力したいのですが、 dosプロンプト等を使って何か良い方法はありますでしょうか? よろしくお願いいたします。

  • シェルスクリプトで一時的にルート権限として実行

    Linuxのシェルスクリプトでそのスクリプトファイルを実行したユーザーにかかわらずそのスクリプト内のコマンドがルート権限として実行されるようにしたいのですが良い方法はありますか? ルートのパスワードを入力せずに一時的にルート権限を使用できるようにしたいのです。 やりたいことは screenでルートユーザでしかアタッチできないプロセスに一時的にアタッチしてコマンドを実行してデタッチするということなのですが… screenにはマルチユーザー機能が在るようで、それはscreenでルートがアタッチしてる場合のみですよね? 間違っていたらすみません。 OSはCentOS 6.2です。 必要な情報があれば補足で追加致します。 宜しくお願いします。

  • プロセスに表示されないソフトについて

    先日入手したソフトを見て思ったのですが そのソフトはタスクマネージャーのアプリケーション欄には表示されるのですが、タスクマネージャーのプロセス欄には実行されている状態でも表示されていませんでした。 おそらく解析されにくくするためにこのようになっているのだと思うのですが、 このようなソフトを作るにはどのようにしたらよいのでしょうか。(DLLなどを作らないといけないのでしょうか) 当方の開発環境はVC#です。 どなたかご教授のほどお願いいたします。

  • シンボルをエクスポートするDLLの初歩的トラブル

    VC++6.0で簡単なDLL作成にチャレンジしたところ、ソースファイルの最後のところで、エンドオブファイルのエラーが出ます。教本と同じように書いたつもりですが、何処が異なっているのか分かりません。エラーを出す原因となっている箇所を御指摘下さい。 ↓ソースファイル #include "stdafx.h" #include "SUB.h" BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } SUB_API LONG _stdcall subtract( LONG sub1 , LONG sub2 ) { return( sub1 - sub2 ); } ↓ここからはヘッダーファイル #ifdef SUB_EXPORTS #define SUB_API __declspec(dllexport) #else #define SUB_API __declspec(dllimport) #endif #ifdef __cplusplus extern "C" { #endif SUB_API LONG __stdcall subtract( LONG sub1, LONG sub2 ); #ifdef _cplusplus } #endif --------------------構成: SUB - Win32 Debug-------------------- コンパイル中... StdAfx.cpp コンパイル中... SUB.cpp C:\Program Files\Microsoft Visual Studio\MyProjects\SUB\SUB.cpp(38) : error C2059: 構文エラー : 'end of file' cl.exe の実行エラー SUB.dll - エラー 1、警告 0

  • DLLの共有メモリと排他処理???

    共有メモリを持つDLLを作りました 機能は単純です (1)カウンターをアップしてその値を返す ⇒ CountUp() (2)カウンターの現在値を返す ⇒ TotalCount() #pragma data_seg(".HShared") static int m = 0; #pragma data_seg() #pragma comment(linker,"/Section:.HShared,rws") int WINAPI DllMain(HINSTANCE hInst, DWORD fdwReason, PVOID pvReserved) { return TRUE; } EXPORT int CALLBACK CountUP() { m++; return m; } EXPORT int CALLBACK TotalCount() { return m; } このDLLは多数のアプリから呼ばれます 当然同時に呼ばれることもあるでしょう カウンター m には排他処理を施してありません 大丈夫でしょうか? それとも排他は Windows様 がしてくれているのでしょうか? 色々と調べてみましたが良く分かりません 宜しくご教授お願い申し上げます

専門家に質問してみよう