2012-08-08 68 views
2

我有一個dll,我想要做一些網絡連接,這個dll是作爲一個非託管DLL從C#應用程序中調用的。 所有初始化都可以正常工作,但每次運行 - > get()時都會凍結。我有這樣的代碼:QNetworkAccessManager->在DLL中調用時會死機

......... 
QUrl path(remotePath); 
QNetworkRequest request(path); 

currentFile.setFileName(localPath); 
if(!currentFile.open(QIODevice::WriteOnly)){ 
doCallback("failed to open: " + localPath); 
} 
doCallback("before get: " + remotePath); 
QNetworkReply* reply = this->manager->get(request); 
doCallback("after get: " + localPath); 
........... 

的「之前得到」回調執行罰款,但從來沒有一個「GET後」所以我想,當管理者試圖將get()方法使其完全凍結。我錯過了一些東西,或者這只是通過DLL而不可能實現的嗎?

+0

當未從非託管DLL調用時,相同的代碼是否工作?即編寫一個小型C++控制檯應用程序並調用相同的代碼並查看會發生什麼。 – 2012-08-08 14:06:09

+0

感謝您的快速回復。是的,我通過Qt創建了一個控制檯應用程序,然後它工作正常......我想知道它是否可以做到這一點,我沒有在我的非託管DLL中運行任何QApplication,但只是做一個類調用..? – 2012-08-08 14:30:19

+0

好的,所以你*沒有*創建一個本地控制檯應用程序並調用相同的代碼。如果您在本機應用程序中調用的所有內容都是發佈的代碼,並且您遇到同樣的問題,那麼您就知道問題所在。 – 2012-08-08 14:52:47

回答

0

奧基,所以我得到了這個工作,我想我會分享我的知識。通過我的非託管dll,我導出了一個創建一個新的QCoreApplication的init函數,通過這個我可以稍後使用事件循環,通過使用QCoreApplication對象作爲我的類執行所有聯網的父類。

QCoreApplication* coreApp = 0; 
extern "C" __declspec(dllexport) void initdll() 
{ 
    if (!coreApp) { 
     int argc = 0; 
     coreApp = new QCoreApplication(argc, 0); 
    } 
    if(!MyFunc){ 
     MyFunc = new QtDll(coreApp); 
    } 
} 

通過我的C#調用這個初始化函數(或其他)應用程序之前,我想任何網絡我得到了它通過將事件循環的Exec用我的第一篇代碼工作。

QNetworkReply* reply = this->manager->get(request); 
currentReply = reply; 
QEventLoop eLoop; 
connect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead())); 
eLoop.exec(QEventLoop::ExcludeUserInputEvents); 

感謝Peter的反饋意見。

1

我的猜測是你的QT庫是針對opensll構建的。 QNetworkAccessManager尋找ssl dlls,libeay32.dll和ssleay32.dll。 Win32 LoadLibrary會掛起整個進程,用戶界面,信號插槽以及所有內容,同時它會嘗試加載這些dll。將這些DLL複製到您的可執行文件的目錄中,並且加載將很快成功。