トップページ > 記事閲覧
dxlibの関数をDLLで呼び出すとプロセスが残る
名前:ぽんず 日時: 2020/03/07 18:22

dxlibを他の言語から使えるようにdllにしたのですが、  Dxtest_End(); // DxLib_End();を呼び出すdllの関数  FreeLibrary(hModule); を実行してプログラムを終了させるとプロセスが残ってしまいます。 試しにdllを呼び出すプログラムを、dllを作成したものと同じ言語(Visual C++ 2019 Community)に しても再現されます。 また、デバッグ実行時とexe直接実行時で動作が変わります。 <デバッグ実行時>  ・プロセスが残らない。  ・ログファイル    4448:入力関連の終了処理... 完了    4523:COMを終了... 完了    4524:    4524:Alloc memory dump    4525: Total size:0(0.000kb) Alloc num:0 <exe直接実行時>  ・プロセスが残る。  ・ログファイル    1630:入力関連の終了処理... 完了 ■dllのコード // ライブラリを初期化する。 extern "C" int __stdcall Dxtest_Init(int DisplayW, int DisplayH, const TCHAR *WindowText, int IconID, int WriteLog = FALSE) { SetOutApplicationLogValidFlag(WriteLog); // ログを出力するかどうか SetUseDirectInputFlag(FALSE); // 入力処理にDirectInputを使用するかどうか ChangeWindowMode(TRUE); // ウィンドウモードで起動するかどうか SetMainWindowText(WindowText); // ウィンドウのタイトル //SetWindowIconID(0); // ウィンドウのアイコン SetGraphMode(DisplayW, DisplayH, 32); if (DxLib_Init() == -1) { return -1; } return 0; } // ライブラリを解放する。 extern "C" void __stdcall Dxtest_End(void) { DxLib_End(); } // メインループ extern "C" int __stdcall Dxtest_MainLoop(void) { if ((ScreenFlip() == -1) || (ClearDrawScreen() == -1) || (ProcessMessage() == -1)) { return -1; } return 0; } ■exeのコード #include <windows.h> typedef int (WINAPI *TDxtest_Init)(int, int, const TCHAR*, int, int); typedef void (WINAPI *TDxtest_End)(void); typedef int (WINAPI *TDxtest_MainLoop)(void); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { HMODULE hModule = LoadLibrary("Dxtest32.dll"); if (hModule == NULL) { return -1; } TDxtest_Init Dxtest_Init = (TDxtest_Init)GetProcAddress(hModule, "Dxtest_Init"); TDxtest_End Dxtest_End = (TDxtest_End)GetProcAddress(hModule, "Dxtest_End"); TDxtest_MainLoop Dxtest_MainLoop = (TDxtest_MainLoop)GetProcAddress(hModule, "Dxtest_MainLoop"); if ((Dxtest_Init == NULL) || (Dxtest_End == NULL) || (Dxtest_MainLoop == NULL)) { FreeLibrary(hModule); return -1; } if (Dxtest_Init(800, 600, "テスト", 0, TRUE) == -1) { return -1; } while (Dxtest_MainLoop() == 0) { } Dxtest_End(); FreeLibrary(hModule); return 0; } DxLib_Endが終わる前にFreeLibraryされてしまったのでしょうか。 何か考えられる原因はありますでしょうか。 よろしくお願いいたします。
メンテ

Page: 1 |

Re: dxlibの関数をDLLで呼び出すとプロセスが残る ( No.1 )
名前:ぽんず 日時:2020/03/07 20:54

補足情報が漏れていました。 OSは、Windows10 Pro 64bit dxlibは「3Dモデル機能&ソフトウエアレンダリング機能無しパッケージ(Ver3.21d)」を使用しています。
メンテ
Re: dxlibの関数をDLLで呼び出すとプロセスが残る ( No.2 )
名前:管理人 日時:2020/03/08 01:37

私も載せたいただいたプログラムで dll を作成してデバッグ実行、exe直接実行 どちらも試してみましたが、どちらもプロセスが残ること無く正常に終了しました 私の手元で作成した dll と exe をこちらにアップしましたので、よろしければ ぽんずさんの環境では私の手元で正常に動作した dll, exe でもプロセスが残って しまうかお試しいただけないでしょうか? m(_ _)m https://dxlib.xsrv.jp/temp/DxLibSimpleDLL.zip
メンテ
Re: dxlibの関数をDLLで呼び出すとプロセスが残る ( No.3 )
名前:ぽんず 日時:2020/03/08 11:37

早速のご確認ありがとうございます。 試してみましたが、やはりプロセスは残ります。 ログの状況も同じで、「7529:入力関連の終了処理... 完了」で終わっています。 ★肝心な情報が抜けていて申し訳ございません。 exeの起動中は、タスクマネージャの「アプリ」グループにexeがいて、 ウィンドウを閉じると、「バックグラウンド プロセス」にexeが移って残り続けます。 このまま新たにexeを起動・閉じるを繰り返すと「バックグラウンド プロセス」にexeがどんどん増えます。 お手数をお掛けし申し訳ございませんが、タスクマネージャの「バックグラウンド プロセス」に 残っていないか、もう一度ご確認いただけないでしょうか。 よろしくお願いいたします。
メンテ
Re: dxlibの関数をDLLで呼び出すとプロセスが残る ( No.4 )
名前:ぽんず 日時:2020/03/08 20:38

別の端末(Windows10 Home 64bit)で実行する機会があったのですが、 そこではプロセスに残ることはありませんでした。 ひとまず管理人様と別の端末でOKでしたので、開発は続けられそうで安心しました。 別の端末はセキュリティソフトも同じなので検討もつきませんが、 もう少しだけ原因を調査してみようと思います。 ※マザーボード(ASRock P67 Extreme4)が古すぎる影響で、見かけ上のCPU使用率が  常に100%になっていることが影響しているのかもしれません。
メンテ
Re: dxlibの関数をDLLで呼び出すとプロセスが残る ( No.5 )
名前:管理人 日時:2020/03/09 05:05

> お手数をお掛けし申し訳ございませんが、タスクマネージャの「バックグラウンド プロセス」に > 残っていないか、もう一度ご確認いただけないでしょうか。 再度確認してみましたが、『バックグラウンド プロセス』にも残っていませんでした ( 因みに環境は Windows10 Pro 64bit です ) > ※マザーボード(ASRock P67 Extreme4)が古すぎる影響で、見かけ上のCPU使用率が >  常に100%になっていることが影響しているのかもしれません。    4448:入力関連の終了処理... 完了 ↑こちらで止まっているとのことですが、この後に来るはずの    4523:COMを終了... 完了 の間には、非同期読み込み用のスレッドを終了する処理が入っているので、CPU使用率は 確かに関係しているかもしれません ( もしかしたらずっと放っておいたらプロセスが終了するかもしれません )
メンテ
Re: dxlibの関数をDLLで呼び出すとプロセスが残る ( No.6 )
名前:ぽんず(解決) 日時:2020/03/14 14:47

再確認ありがとうございます。 本日、こちらでも再確認したところ、プロセスが残らなくなっていました。 CPUは相変わらず常時100%なので、もしかしたらウイルス対策ソフトが 悪さをしていたのかもしれません。 いずれにせよ、再発したとしても、おそらく私の環境が悪いと思いますので、 本件は解決とさせていただきます。 この度はプログラム作成、再確認依頼等、度々お手数をおかけし申し訳ございませんでした。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存