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されてしまったのでしょうか。
何か考えられる原因はありますでしょうか。
よろしくお願いいたします。