2011-12-19 25 views
0

Let's考慮從Qt的文檔這個片段:QLibrary's解析函數只有一個參數?

QLibrary myLib("mylib"); 
typedef void (*MyPrototype)(); 
MyPrototype myFunction = (MyPrototype) myLib.resolve("mysymbol"); 
if (myFunction) 
    myFunction(); 

這會加載一個.dll到內存中,並解決符號「mysymbol」,這樣我就可以用「myFunction的」。我在這裏工作。我也可以調用myFunction(arg_1)。

但是,當我打電話myFunction的(ARG_1,arg_2)我得到一個「太多的參數功能」誤差。 那麼,它真的只可以調用myFunction的1種說法或者是有什麼I'm失蹤?

+0

是'mysymbol'一個'EXTERN C'功能?你在調整你的MyPrototype嗎? – Mat

+0

是的,我用extern C聲明瞭它。我不認爲我必須調整原型(無論如何),因爲錯誤發生在編譯時,所以沒有與.dll的連接。 – LarissaGodzilla

+1

如果'mysymbol'有兩個參數(說'int's),在此代碼(不是在庫),您需要調整您的MyPrototype'typedef'相匹配。該typedef和庫中的實際功能_must_相匹配。 – Mat

回答

1

讓我改寫墊的評論。我花了好幾個小時才找到我的問題。

假設DLL:

extern "C" __declspec(dllexport) void function1() 
{ 
    //code 
} 
extern "C" __declspec(dllexport) int function2(int arg1) 
{ 
    //code 
} 
extern "C" __declspec(dllexport) char function3(int arg1, int arg2, int arg3) 
{ 
    //code 
} 

的實施應該是這樣的:

typedef void (*_function1)(); 
typedef int (*_function2)(int); 
typedef char (*_function3)(int, int, int); 

QLibrary myLib("mylib"); 

_function1 function1 = (_function1) myLib.resolve("function1"); 
_function2 function2 = (_function1) myLib.resolve("function2"); 
_function3 function3 = (_function1) myLib.resolve("function3"); 

if (function1 && function2 && function3) 
{ 
    //implement them 
    function1(); 
    int test = function2(123); 
    char test1 = function3(1, 2, 3); 
}