GuruGuruSMF4.dll v4.0.7 ソースコード修正箇所

dmusici.h を dmusici_h\ 以下に置く(VS2022 にない為)
kbdmusic.kpi で使用しているのと同じもの。VS のどのバージョンのものだったかは不明

------------------------------------------------------

core/dxmus.core/GuruGuruSMF4 各プロジェクトの追加のインクルードディレクトリに
dmusici_h を追加

------------------------------------------------------

GuruGuruSMF4.cpp

#pragma comment(lib, "dxguid.lib")
↑をコメントアウト(VS2022 にない為)

------------------------------------------------------

core\stdafx.cpp / dxmus_core\stdafx.cpp の冒頭に 
#include <initguid.h>

を追加（リンカエラー対策）
(#pragma comment(lib, "dxguid.lib") の代わり)

------------------------------------------------------

core\stdafx.h / dxmus_core\stdafx.h / GuruGuruSMF4\stdafx.h

#ifndef WINVER 等の部分をコメントアウト

------------------------------------------------------

smf.cpp

// デストラクタ
GgsCode::~GgsCode()
{
	Clear();
	delete[] binary;//メモリリーク回避 by Kobarin
}

------------------------------------------------------

SmfInterpreter.cpp

void SmfInterpreter::Initialize(Smf* newSmf)
{
	delete[] trackData;// メモリリーク回避 by Kobarin
	smf = newSmf;
	trackCount = smf->GetTrackCount();
	trackData = new TrackData[trackCount];
	for (int i=0; i<trackCount; i++){
		TrackData& trk = trackData[i];
		trk.SmfTrack = smf->GetTrack(i);
	}
	
	Rewind();
}

------------------------------------------------------

PowerControlWindow.h

	class PowerControlWindow
	{
	private:
		HWND _hWnd;
		HANDLE _hEvent; //by Kobarin (ウィンドウの作成が終わるまで待つ用)
		HANDLE _hThread;//by Kobarin (スレッドが終了するまで待てるように)
		...

------------------------------------------------------

PowerControlWindow.cpp
スリープ時にデバイスを閉じる処理
おそらくオリジナルの v4.0.7 が FreeLibrary 時にフリーズする原因
VS2022 でビルドすると修正しなくてもフリーズしないが多分偶然
DllMain の DLL_PROCESS_DETACH でこのクラスで生成されるスレッドを終了するのが
直接の原因(多分)、他にもウィンドウが作成される前にデストラクタで SendMessage 
する可能性がある等の修正

    /* del by Kobarin
    void thread_entry(void* p_userdata)
    {
        PowerControlWindow* p_win = (PowerControlWindow*)p_userdata;
        p_win->createWindow();
        p_win->MessageLoop();
    }
    */
    //by Kobarin
    unsigned __stdcall thread_entry(void* p_userdata)
    {
        PowerControlWindow* p_win = (PowerControlWindow*)p_userdata;
        p_win->createWindow();
        p_win->MessageLoop();
        return 0;
    }
    //ここまで

	// コンストラクタ
	PowerControlWindow::PowerControlWindow()
	{
        //_beginthread(thread_entry, 0, this);//del by Kobarin
        //by Kobarin
        _hWnd = NULL;
        _hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
        _hThread = (HANDLE)_beginthreadex(NULL, 0, thread_entry, this, 0, NULL);
        //ここまで
	}

	// デストラクタ
	PowerControlWindow::~PowerControlWindow()
	{
        WaitForSingleObject(_hEvent, INFINITE);//by Kobarin(ウィンドウが作成し終わるまで待つ)
		SendMessage(_hWnd, WM_CLOSE, NULL, NULL);
        //by Kobarin
        WaitForSingleObject(_hThread, INFINITE);
        CloseHandle(_hEvent);
        CloseHandle(_hThread);
        //ここまで
	}

    void PowerControlWindow::MessageLoop()
    {
        MSG msg = {0};

        SetEvent(_hEvent);//by Kobarin(ウィンドウの作成完了)
        while (GetMessage(&msg, NULL, 0, 0))
        {
            if(msg.message == WM_QUIT)
            {
                break;
            }

            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        UnregisterClass(g_AppName, GetModuleHandle(NULL));//by Kobarin
    }

------------------------------------------------------

GuruGuruSMF4.cpp

	//by Kobarin
	//後始末用API追加(FreeLibrary する前に呼ばないといけない)
	void WINAPI GGS4Uninitialize_k()
	{
		Ggs4Controller::FreeInstance();
	}
	//ここまで

------------------------------------------------------

GuruGuruSMF4.def

  GGS4Uninitialize_k; 後始末用API追加 by Kobarin

------------------------------------------------------

GuruGuruSMF4_Cpp_Dynamic.h/cpp

色々
