6

私の会社は、アプリケーションに接続するために使用できる API 関数をサードパーティに提供する DLL をサードパーティに提供しています。DLL は VC9 で作成され、API 関数は VC の既定の呼び出し規約 (__cdecl) を使用しました。サードパーティは、このインターフェイスを中心にアプリケーションを構築しました。

私は今、更新されたバージョンの DLL を作成する任務を負っています。DLL には、古いものとまったく同じインターフェイスを持たせて、互換的に使用できるようにしたいと考えています。残念ながら、現在の開発環境は CodeGear RAD Studio 2007 であるため、それを使用して DLL を作成する必要があります。

最善の解決策は、古い DLL と新しい DLL の両方が関数を __stdcall としてエクスポートするようにすることです。その後、サードパーティ アプリケーションを再リンクして __stdcall 関数を期待することができ、誰もが満足するでしょう。残念ながら、さまざまな理由から、これは起こりそうにありません。

または、DLL で関数を __cdecl として宣言することもできます。サードパーティは __cdecl 関数を期待しているので、これは良い解決策のようです。残念ながら、CodeGear は __cdecl 関数の名前にアンダースコア ('_') を追加することを主張しています。これは、サードパーティ アプリケーションが、使用する DLL に応じて、条件付きでMyApiFunction(...)またはを呼び出す必要があることを意味します。_MyApiFunction(...)

私の質問は、API 関数を新しい DLL からエクスポートして、それらが __cdecl であり、アンダースコア ('_') のプレフィックスが付いていない方法を教えてください。

4

3 に答える 3

7

.DEF ファイルを使用する必要があります。

EXPORTS
    HTMLayoutClassNameA = HTMLayoutClassNameA
    HTMLayoutClassNameW = HTMLayoutClassNameW
    HTMLayoutClipboardCopy = HTMLayoutClipboardCopy
    ...

ここにある

externalname = internalname 
于 2011-05-13T06:38:16.857 に答える
0

Borland C/C++ コンパイラには、シンボルのアンダースコア生成をオンまたはオフにするオプションがあります。-u(デフォルト) シンボル名にアンダースコアを生成します。コマンドラインに追加-u-して、それが役立つかどうかを確認してください。(CodeRad のどこでこれを行うべきかはわかりませんが、IDE のどこかで実行できることは覚えています)。

于 2011-05-13T07:10:19.450 に答える