Forums: おーぷんMIDIぷろじぇくとフォーラム (Thread #44343)

MIDIIOのx64への対応について (2021-07-06 15:02 by suzume #87698)

いつもopenmidiプロジェクトにお世話になっています。

MIDIIOライブラリですが、私の環境ではx86でビルドしたものでしか動かず
x64ではクラッシュして困っていた(MIDIDATAライブラリはx64でも動きます)のですが、
以下のようにコールバック関数をDWORD_PTR に変更することで正しく動作することを確認しています。
MIDIOutも同様の変更でできました。

結構困っていたことだったので、情報共有として投稿させていただきました。

-------------------------------------------------------------------------------------------------------------------------------------
static void CALLBACK MidiInProc (HMIDIIN hMIDIIn, UINT wMsg,
DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2) {

nRet = midiInOpen ((HMIDIIN*)&(pMIDIIn->m_pDeviceHandle), i,
(DWORD_PTR)MidiInProc, (DWORD)(pMIDIIn), CALLBACK_FUNCTION);

Reply to #87698×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

Re: MIDIIOのx64への対応について (2021-07-06 20:08 by kuzu #87699)

このたびはopenmidiprojectをご利用いただき、誠にありがとうございます。
ご指摘の通り、64bit版を作るにあたって、多くのエラーがあります。
このたびは、貴重なバグ報告をいただきありがとうございます。

現在、Windows7のノートパソコンが壊れたので、Windows10に移行し、
これに伴い、VisualStudio2008のサポートが切れたので、VisualStudio2015に移行している所です。
これに伴い、ソースコードも順次32bit/64bit兼用修正していく予定です。

なお、Windowsにおいて、各変数のサイズをまとめると下記のようになります。

ヴァージョン 32bit版 64bit版
int 32bit 32bit
long 32bit 32bit
ポインタ 32bit 64bit
INT_PTR 32bit 64bit
LONG_PTR 32bit 64bit
size_t 32bit 64bit

ポインタをlongやDWORDに格納すると入りきれなくなることや、
size_tをlongやDWORDに格納すると入りきれなくなることが主に問題となります。
また、WindowsAPIも一部、引数や戻り値が32bit→64bitに変わっています。

32bit固定前提でコーディングされているのは、
このプロジェクトが始まったとき(1997年頃)はWindows95とVisualC++4.0を使っていたので、
当時はまだコンパイラによってはint型が16bitだったりして、
16bitコードの混入を避けることを最優先したためです。
また、当時はINT_PTRやLONG_PTRがなかったと思います。

64bit版が出てから、現状は問題があることに気づいてはいましたが、
会社が大変忙しく、64bitの問題については全く手を付けていないのが実情です。
睡眠時間をこれ以上削るのも厳しく、一時期は頻繁に電車内で倒れたり、
食事が自力で取れないほどの状況に陥っていたので、相当停滞していまいしたが、
VisualStudio2015への移行を機に、順次ソースコードを修正していく予定です。

なお、いちおうコンパイル・ビルドは通るようにする予定ですが、
バイナリは当分は32bit版しか扱わない予定です(64bit版をテストする時間がない)。
Reply to #87698

Reply to #87699×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

Re: MIDIIOのx64への対応について (2021-07-07 13:23 by suzume #87700)

お忙しいところご回答ありがとうございます。私もVC++5.0から使っていたので状況わかります。

C言語で動くフリーのMIDIライブラリ(パーサ・制御)はあまりないようですので大変助かっています。

最近はx64での開発が多いかと思いますので、プロジェクトの更新はなくても、
少し変更すればx64でもちゃんと動く、という情報があるだけでも、利用者からすると
有用だと思い投稿した次第です。

無理をせずにお大事になさってください。ありがとうございました。
Reply to #87699

Reply to #87700×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login