0

MyDll.dll とその関数を以下のように定義しました

void pascal Myfunction(BOOL);

別のプロジェクトで関数を使用しようとすると、関数のアドレスを取得できませんGetProcAddress()。これが私のコードです:

void callMyDll()
{
 HINSTANCE hDll;

 hDll=LoadLibrary(_T("MyDll.dll");

 if(hDll!=NULL)
 {
  cout<<"\n DLL Loaded \n";
 }
 else
  cout<<"\n DLL Not loaded\n"

 typedef void (__stdcall *MyFunction)(bool)

 Myfunction mf1 = (MyFunction) GetProcAddress(hDll, "MyFunction");

 if (mf1!=NULL)
  cout<<"\n Function Loaded Successfully \n";
 else
  cout<<"\n Function not loaded \n";

 FreeLibrary(hDll);
}

次のような出力が得られます。

DLL Loaded
Function not loaded

しかし、glut32.dll のような既知の DLL とその関数を試してみると、正常に動作しています。

のような機能に問題があるのではないかと思います

void pascal MyFunction(BOOL);

この点で誰かが私を助けることができますか?

4

4 に答える 4

2

extern "C"名前マングリングを防ぎ、関数が確実にエクスポートされるようにするために使用する必要があります。

extern "C" __declspec(dllexport) void Myfunction(BOOL);

DLL からのエクスポートを表示するにdumpbin.exeは、Visual Studio に同梱されているユーティリティを使用できます。

dumpbin.exe /EXPORTS MyDll.dll

これにより、エクスポートされたすべてのシンボルの名前が一覧表示されます。

これに加えて、次のコンパイラ スイッチのいずれも指定されていません。

Gz __stdcall calling convention: "Myfunction" would be exported as Myfunction@4
Gr __fastcall caling convention: "Myfunction" would be exported as @Myfunction@4

注:最後のシンボルはコンパイラのバージョンに依存していると思いますが、それでも「Myfunction」だけではありません。

于 2012-01-25T11:10:11.837 に答える
1

DLL のエクスポート プロセスは、名前のマングリングと装飾の対象となります。長く廃止された 16 ビット呼び出し規約は、32 ビット プラットフォームpascalと同等です。stdcall

まず、extern "C"C リンケージを指定し、名前マングリングを無効にするために使用する必要があります。

ただし、関数は引き続き名前の装飾の対象となります。でエクスポートする__declspec(dllexport)と、実際には という名前でエクスポートされます_Myfunction@4。本当の名前でエクスポートしたい場合は、.def ファイルを使用する必要があります。

ただし、DLL から関数をまったくエクスポートしていない可能性は依然として残っています。Dependency Walkerを使用して、エクスポートされたかどうか、エクスポートされた場合はどのような名前であるかを確認します。

于 2012-01-25T11:17:20.037 に答える
0

シンボルは装飾されるため、 と呼ばれることはなく、 と呼ばれるMyFunction可能性が高くなり_MyFunction@4ます。これは、 dumpbinなどを使用してすばやく確認できます。

マングリングの詳細については、こちらを参照してください。マングリングを回避したい場合は、defファイルを使用してシンボル名 (または序数) を指定する必要があります。

于 2012-01-25T13:11:18.630 に答える
0

なぜpascal呼び出し規約を使用しているのですか? おそらく、それによってシンボルの名前が変更されます。その場合は、それを考慮する必要があるかもしれません。

于 2012-01-25T11:05:34.183 に答える