3

私はサードパーティのアプリケーション用のモジュールを書いています。アプリケーションのuses __cdecl呼び出し規約。

同時に、私はuses __stdcall規約を呼び出すレガシーDLLを持っています。

exports __cdecl一方の端で機能し、もう一方の端で機能するラッパーを作成できますimports __stdcallか?他にどのようなオプションがありますか?

ありがとう、

編集:

これが私の状況を明確にするのに役立ついくつかの追加情報です。

third_party.exeにアクセスする必要があるものがありますskeleton.dll。ソースコードのskeleton.dllには、以下のヘッダーファイルが含まれており、__cdeclを使用してコンパイルされます。

#ifdef _EXPORTING
  #define DECLSPEC    __declspec(dllexport)
#else
   #define DECLSPEC    __declspec(dllimport)
#endif

#ifdef __cplusplus
   extern "C" {  
#endif

DECLSPEC int ICD_Create(char* id);
...
...
...

理想的には、スケルトンソースコードを使用してDLLを開発します。残念ながら、現在のVB6レガシーコードをC++に移植するには時間がかかりすぎます。このため、このガイドラインに従ってVB6コードをハックする必要がありました(これは回避策ですが、ActiveXDLLを標準のCDLLとして使用できます)。

私は、変更されたVB6呼び出し規約、またはそれを変更する方法に100%自信がありません。演習では__stdcallを使用しており、私が開発したテストアプリケーションでも問題なく動作するようです。ただし、サードパーティのアプリケーションでテストすると、特定の関数が適切に呼び出されますが、他の関数ではクラッシュします。

アーキテクチャは次のようになります。

Application: ThirdParty.exe (out of your control: Uses __cdecl) 
     |
     |
Plugin module: Skeleton.dll (your code)
     |
     |
Legacy DLL: ModifiedVB6.dll (out of your control: Seem to work with __stdcall)

レガシーDLLは、dll、lib、およびdefファイルを生成します。ヘッダーファイルがありません。

4

2 に答える 2

2

__declspec(dllexport)DLL から識別子をエクスポートするようにコンパイラに指示するためだけに必要です。これは、定義する (そしておそらく) エクスポートする関数の呼び出し規約、またはインポートする関数の呼び出し規約とは何の関係もありません。これは個別に指定する必要があり、問題ありません (ただし、呼び出し元がスタックをクリーンアップする必要があるため、__stdcallvararg 関数は でなければならないことに注意してください)。__cdecl

はい、DLL を別の DLL でラップして、DLL をインポートし、__cdecl呼び出し規則を持つ関数をエクスポートすることはできますが、DLL のユーザーを混乱させる可能性があります。私はこれをしませんが、可能です。

于 2011-08-02T17:31:06.400 に答える