もともとMSVSで書かれたライブラリ(dll)があり、クロスプラットフォーム(Mac / Win)を作成する必要があります。XCodeを使い始めましたが、新しいEmbarcadero C ++ビルダーXE3を使用すると、1つの開発環境がより良い方法になると考えています。ホストアプリケーションはDelphiで記述されているため、1セットのツールに移動する理由があります。
私の既存のコードでは、すべてがcdeclですが、これをC++ビルダーで動作させることはできません。stdcallに変換すると正常に動作しますが、OSXでライブラリを使用する場合は、cdeclを使用する必要があります。
MSVCでは、次のように関数をエクスポートします。
extern "C" __declspec(dllexport) int Init(char * init_dir, DebugCallbackFunc f, DeviceCallbackFunc f1)
C ++ Builderでは、次のようにエクスポートしています。
extern "C" __declspec( dllexport ) int _cdecl Init(char * init_dir, DebugCallbackFunc f, DeviceCallbackFunc f1)
問題は、cdeclを使用するとDelphiホストアプリケーションがGetProcAddressで常にNULLを返すが、stdcallに変更すると正常に動作することです。
TUDMXInit = function(p: PAnsiChar; f: TDebugCallbackFunc; f1: TDeviceCallbackFunc): integer; cdecl;
また、OSXでエクスポートされた関数のプレフィックスとなる「_」を処理するための最良の方法の例をいただければ幸いです。すべての関数の前にこれを追加するために条件を使用する必要がありますか?
前もって感謝します。マーティン