1

私はEXEにコンパイルするVC++win32アプリケーションを持っています。しかし、今度はそれをdllに変換して、別のアプリケーションにロードできるようにします。VisualStudioのプロパティを.EXEから.DLLに変更して正常に変換しようとしましたが、GetProcAddressを使用すると常にNULLが返されます。私がしていることが正しいか間違っているかわかりません。

基本的にこれは私が達成したいことです:

  1. プロジェクト1とプロジェクト2をリンクしたい
  2. プロジェクト2は、project1の関数を呼び出すことができる必要があります(これはexeファイルです)

編集 こんにちはみんなあなたの入力に感謝します。私はあなたたちが言ったことを話しました。それでも、GetProcAddressはゼロを返します。私は何か間違ったことをしていますか?以下に私のdll読み込みコードを示しています。

HINSTANCE LoadMe  =  LoadLibrary( _T("D:\\VC++Project\\CVAList\\CVAList\\ExportTest.dll"));

   if (LoadMe != 0)
    printf("LoadMe library loaded!\n");
    else
     printf("LoadMe library failed to load!\n");


   EntryPointfuncPtr LibMainEntryPoint;   
   LibMainEntryPoint = (EntryPointfuncPtr)GetProcAddress(LoadMe,"PrintFloatsVal");
   LibMainEntryPoint (a1 ,a,b,c,d ); // 4 double 

DLLエクスポートコードを編集する

#define DllExport   __declspec( dllexport ) 


DllExport  void  PrintFloatsVal ( int amount, double &d1 ,double &d2 , double &d3 ,double &d4)
{
....
..
}
4

1 に答える 1

2

__declspec dllexportキーワードを使用して、アクセスしたい機能をエクスポートする必要があります。

したがって、マニフェスト定数'BUILDING_MY_DLL'をプロジェクトに追加すると、関心のある関数を宣言するヘッダーファイルを、DLLプロジェクトとDLLを使用するすべてのコードの両方で使用できます。

#ifdef BUILDING_MY_DLL
#define MY_DLL_EXPORT __declspec dllexport
#else
#define MY_DLL_EXPORT __declspec dllimport
#endif

そして、エクスポートしたい関数を装飾します。

MY_DLL_EXPORT BOOL Func1(int a);

アクセスしたい関数がC++で実装されている場合、関数のオーバーロードやその他の目的で装飾され、他の関数と同じように直接アクセスするのが最適です。ただし、使用したい場合GetProcAddress()は、関数をで囲むことにより、C-linkageを指定することをお勧めしますextern "C" { ... }。これにより、エクスポートされた名前がコード内で使用されている名前と同じになります。

参照: http: //msdn.microsoft.com/en-us/library/a90k134d (v = vs.80).aspx

于 2011-03-27T09:35:07.397 に答える