2013-05-23

[Qt]如何避免Qt所寫的dll被帶有參數的呼叫時造成的crash?

假設我們有一個由Qt所寫成的DLL, 當中有一個StartServer是這樣定義的:
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");

如此一來就可以正確的傳值呼叫我們想要使用的函數啦!

沒有留言:

張貼留言