extern "C" MY_EXPORT void CALLBACK *StartServer(char* pcAddress, unsigned short uiPort, char* pcWorkingPath) { if(g_pNewClass != NULL) { g_pNewClass->Start(pcAddress, uiPort, pcWorkingPath); } else { WriteDebug("g_pNewClass is NULL"); } return g_pNewClass; }上述的CALLBACK很關鍵!!
2.而我們一般要呼叫dll的方式如下(以vc6為例):
typedef void (CALLBACK* START)(char* , unsigned short , char* ); START start = NULL; start = (START)GetProcAddress(m_hMod, "StartServer"); if(start == NULL) { //載入函數位置失敗 TRACE("start not found"); } else { start(m_pAddr, m_port,m_pWP); }
於是我們就會發現函數的位置無法取得,用Dependency Walker這套萬惡的工具一看DLL的內容才知道,
原來是Qt自己把函數的名字改掉了.
[名稱被改成了StartServer@12] |
所以我們也要在GetProcAddress時將名字改成DLL內部所記載的:
start = (START)GetProcAddress(m_hMod, "StartServer@12");
如此一來就可以正確的傳值呼叫我們想要使用的函數啦!
沒有留言:
張貼留言