0

外部ドライバー dll を使用しているときに、一部のプログラムで問題が発生しました。

正常にコンパイルされますが、ビルドしようとすると次のようになります。

error LNK2001: unresolved external symbol "void __stdcall Function1(void (__fastcall*)(int))" (?Function1@@YGXP6IXH@Z@Z)

関数のヘッダー定義:

void __stdcall                            Function1(TDeviceCallback callback);

さて、「珍しい部分」 このプロジェクトは、デバイス dll と他のアプリケーションとの間でプロキシのように機能する dll です。そのアプリケーションが c 関数を呼び出すことができるという制限のおかげで、プロキシ dll を動作させるにはいくつかの特別なオプションを使用してビルドする必要があります。

オブジェクト/ライブラリ

winapims.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib 

プロジェクト オプション:

winapims.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:no /pdb:"Release/test2.pdb" /machine:I386 /out:"Release/test2.fll" /implib:"Release/test2.lib" 

このようなプロキシは初めてではありませんが、このような問題が発生したのは初めてです。それが何であるかについてのアイデアはありますか?

編集:問題は、プロキシを fastcall として使用する必要があるようですが、リンカはその関数だけで変換に問題があります:(

4

1 に答える 1

0

問題は C++ の名前マングリングにあるようです。C 関数を次のようにエクスポートする必要があります: ヘッダー ファイルで

#define MYLIB_API __declspec(dllexport)
#ifdef __cplusplus
extern "C" MYLIB_API int fnmylib(void);
#else
MYLIB_API int fnmylib(void);
#endif

ソースファイルで、それらを次のように定義します

MYLIB_API int fnmylib(void)
{ ... }
于 2013-03-13T14:05:27.043 に答える