COM を使用せずに perl コードで C++ dll を呼び出す例を探しています。win32::API を使用できますか? ライブラリは Visual Studio 2010 で作成されています。
2 に答える
Win32::API を使用して C++ メソッドまたはコンストラクターを呼び出すことは、おそらくありません。
Win32::API は、32 ビット ウィンドウで C++ 呼び出し規約 (__thiscall) をサポートしていません。64 ビット Windows では、Win64 には呼び出し規約が 1 つしかないため、機能します。C++ で発生する最大の問題は、ABI の互換性と名前マングリングです。Win32::API は、名前マングリングを処理する助けを提供しません。各 C++ 関数 (C++ のメソッド) のマングル名を見つけて、それを Win32::API に渡す必要があります。Win32::API は任意の C 関数ポインタで動作できるため、(COM のように) C 関数でいっぱいの vtable は Win32::API で正常に動作します。この古い例については、http://perlmonks.org/?を参照してください。 node_id=969555. また、C++ オブジェクトと C++ 標準ライブラリがアセンブリ コード レベルでどのようなものかを知る必要があります。Win32::API は 32 ビット C++ 呼び出し規約をサポートしていません。これが最初の道路封鎖です。私 (Win32::API の作成者の 1 人) は、いつか Win32::API で __thiscall を実装するかもしれません。
COM/OLE は、異なる C++ コンパイラ間の ABI の問題に対処する必要がないように考案されました。Win32::API は、純粋な C で COM がどのように機能するかを知っていると仮定して、COM オブジェクトで問題なく機能します。純粋な C で COM がどのように機能するかを学ぶには、この記事シリーズhttp://www.codeproject.com/Articles/13601を読むことをお勧めします。 /COM-in-plain-C . Win32::OLE と Win32::API は、perlmonks の例に示されているように、一緒にハッキングすることができます。