2012-08-08 18 views
0

我有一個源文件file.cpp,在它內部我需要訪問一個DLL file.dll。此外,我需要訪問file.dll內的功能DoFunction,我需要從file.cpp傳遞一些變量。調用並傳遞一個DLL變量C++

我:

m_hinstPtiDLL = LoadLibrary("file.dll"); 
pGNSI = (PGNSI) GetProcAddress(m_hinstPtiDLL, "DoFunction"); 

我希望能夠通過DoFunction 7變量,並使其返回所需的值。

在此先感謝

回答

1

這將返回一個指向該函數的指針。

pGNSI = (PGNSI)GetProcAddress(m_hinstPtiDLL, "DoFunction"); 

如果它不是NULL那麼只需調用它。例如,如果函數的簽名預計7個參數:

if (pGNSI) 
{ 
    pGNSI(p1,p2,p3,p4,p5,p6,p7); 
} 
+0

這是從DLL中的函數,當我嘗試這樣做,你說我得到錯誤C2197:「PGNSI」:參數太多呼叫 (這需要10不是7對不起) 的extern「C」 __declspec( DLLEXPORT)Error_t DoFunction( \t UI8 * CDB, \t UI8 cdblen, \t UI8 *緩衝液, \t UI8 NHA, \t UI8 TID, \t UI16超時, \t UI32 BUFFER_LENGTH, \t UI32轉印_direction, \t ui8 * senseBuffer, \t ui32 * cmdId) – 2012-08-08 18:53:03

+0

@Kyle爲什麼你說在這個問題中需要7個參數,但現在你想通過它10?您必須傳遞與函數原型中列出的相同數量的參數。 – 2012-08-08 20:07:31

+0

請在括號中註明,它表示需要10次而不是7.無論哪種方式需要10次我給了它10次我仍然遇到了這個錯誤。 – 2012-08-08 20:09:25

1

我想你已經採取了從msdn的例子。

pGNSI應該是一個指向DLL中定義函數的確切原型的函數的指針。如果您在DLL此功能:

void myFunc(int arg1, int arg2); 

然後pGNSI應該是:

typedef void (*pGNSI)(int arg1, int arg2); 

那麼你不應該得到一個錯誤。

這樣做的一個好方法是從DLL中提供一個導出的頭文件,該頭文件聲明瞭函數指針並在應用程序中包含此頭文件。這使得定義一致且沒有錯誤。