2012-08-08 107 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复制到您的可执行文件的目录中,并且加载将很快成功。