DLLからフォームを呼び出してMediaPlayerをActiveXで使おうと思うんですが、
呼び出すとページ違反で終了します。
どうすれば使用できますか?
フォームの「所有者」は「誰」なのでしょうか。
推測で2通り書いてみます。
アプリケーションが、DLLをLoadLibraryして、その中で(Application側が呼び出そうと、DLL側が呼び出そうとどちらでも)、「DLLが持っているフォーム」を呼び出している場合。
アプリケーションのApplicationオブジェクトと、DLLのApplicationオブジェクトが違うために、フォームの所有者が変わるためうまく動かないのだと思います。
DLLに初期化関数を用意して、アプリケーション側のApplicationを渡して、DLL側でApplication変数に渡されたオブジェクトを入れればよろしいかと思います。
アプリケーションが、DLLをLoadLibraryして、DLL側の関数から、アプリケーション側のフォームを呼び出している場合。
アプリケーション側とDLL側のFormの定義は同じでしょうか。
同じでなければ、アプリケーション側のフォームを、DLL側から操作することはできません。
# すでにある同じプロパティなどは操作可能です
アプリケーション側で、Formを操作するラッパー関数をexportしておき、それを呼び出すようにするのが簡単です。
もし、このあたりに問題がなければ、アプリケーション側でOleInitializeしていますか?
していないとActiveXがうまく動かないかもしれません。
フォームの所有者はDLLです。
DLLに含まれるフォームを呼び出して使っています。
1つ目の方法でDLLを作った場合、他言語から呼び出すことは可能でしょうか?
DLLのフォームを、DLL内だけで完結していれば大丈夫だと思います。
# Delphiの場合、リンクするライブラリが同じなのが問題だったはず。
無事DLL内のフォームにMediaPlayerコントロールを使用することが出来ました。
ありがとうございました。
ツイート | ![]() |