私はサードパーティのアプリケーション用のモジュールを書いています。アプリケーションの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ファイルを生成します。ヘッダーファイルがありません。