1

関数を次のように宣言しました__declspec(dllexport) void TakeInput();

この関数を持つDLLはC#でエクスポートされます。c#コードにないエントリポイントとしてこの関数への関数呼び出しを実行しているときに失敗します。

グーグルは、問題が正しいエントリポイントにあることを示しています。提供されていません。この関数のマングル名を提供する必要があります。

では、どうすればこの関数の名前が壊れているのか知りたいのですが。

4

3 に答える 3

4

名前の混乱を避けるために、extern "C"

extern "C" __declspec(dllexport) void TakeInput();

詳細:externを使用してリンケージを指定する

于 2011-07-01T11:37:40.027 に答える
0

本当に必要な場合は、DependancyWalker (http://www.dependencywalker.com) または DLL エクスポートを一覧表示するその他のツールを使用して、破損した名前を取得できますが、Armen が提案したことを行うのが最善です。

于 2011-07-01T11:48:22.340 に答える
0

マングルされた名前を計算しようとする代わりに、マングルされていない名前をエクスポートすることをお勧めします。これを行うには、次の 2 つのことを行う必要があります。

  1. 関数に C リンケージを使用して C++ 名マングリングを無効にする これは、 を使用して行うことができますextern "C"

  2. 関数が C 呼び出し規約を使用していることを確認してください。これは (少なくとも Microsoft Visual Studio では) デフォルトですが、このデフォルトは (呼び出し規約を切り替える) および (呼び出し規約を切り替える) コマンド ライン スイッチ を使用して/Gr変更__fastcallでき/Gz ます__stdcall__cdecl次のように使用して、C 呼び出し規則を適用できます。

全体として、関数が としてエクスポートされるようにするにはTakeInput、次を使用します。

extern "C" __declspec(dllexport) void __cdecl TakeInput();
于 2011-07-01T11:51:54.400 に答える