2011-03-27 41 views
1

我有一個編譯成EXE的VC++ win 32應用程序。但現在我想將它轉換爲DLL,以便我可以在另一個應用程序中加載。我嘗試將.EXE中的Visual Studio屬性更改爲成功轉換它的.DLL,但是當我使用GetProcAddress時,它始終返回NULL。我不確定我在做什麼是對還是錯。製作一個VC++ .exe到DLL。它可能嗎?

基本上這就是我想實現:

  1. 我想鏈接項目1和項目2
  2. 項目2應該能夠調用PROJECT1的功能(這是一個exe currenlty)

編輯 嗨,大家好,感謝您的意見。我告訴大家你說的。即使那樣我的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) 
{ 
.... 
.. 
} 
+0

1)你導出要從項目2調用的方法? 2.)你有沒有考慮靜態鏈接,這可能更容易? – Philipp 2011-03-27 09:30:00

+0

不..我沒有 – 2011-03-27 09:43:46

回答

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(),但您最好通過圍繞extern "C" { ... }的函數來給它配置C-linkage。這將使導出的名稱與代碼中使用的名稱相同。

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

+0

嗨,謝謝你的輸入。我告訴你說的。即使那樣我的GetProcAddress返回零。我有什麼不對嗎?在下面顯示我的dll加載代碼。 HINSTANCE LoadMe = LoadLibrary(_T(「D:\\ VC++ Project \\ CVAList \\ CVAList \\ ExportTest.dll」)); if(LoadMe!= 0) printf(「LoadMe library loaded!\ n」); \t else \t printf(「LoadMe庫無法加載!\ n」); EntryPointfuncPtr LibMainEntryPoint; LibMainEntryPoint =(EntryPointfuncPtr)GetProcAddress(LoadMe,「PrintFloatsVal」); LibMainEntryPoint(a1,a,b,c,d); // 4 double – 2011-03-27 10:02:12

+0

嘿,我已經把上面的代碼格式(有問題)相同的代碼。 – 2011-03-27 10:11:18

+0

@iTion:我已經編輯了我的答案 - 如果您希望使用'GetProcAddress()'來訪問它,請在頭文件中的函數週圍放置'extern「C」{...}「。 – trojanfoe 2011-03-27 10:23:53