QNetworkAccessManager->在DLL中调用时会冻结

时间:2012-08-08 13:46:09

标签: c# c++ qt dll qnetworkaccessmanager

我有一个dll,我想做一些网络,这个DLL从C#应用程序作为非托管DLL调用。 所有初始化都可以正常工作但每次运行时都会冻结 - > get()。我有这段代码:

.........
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”回调被执行得很好,但从来没有“get get”,所以我猜它在管理器尝试Get()方法时完全冻结了。我错过了什么,或者这只是通过DLL而言根本不可能?

2 个答案:

答案 0 :(得分:1)

我的猜测是你的QT库是针对opensll构建的。 QNetworkAccessManager查找ssl dll,libeay32.dll和ssleay32.dll。 Win32 LoadLibrary会挂起整个进程,UI,信号插槽,所有内容,同时尝试加载这些dll。将这些dll复制到可执行文件的目录中,加载将很快成功。

答案 1 :(得分:0)

哦,所以我得到了这个工作,我想我会分享我的知识。使用我的非托管DLL,我导出了一个init函数,它创建了一个新的QCoreApplication,通过这个我以后可以使用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#(或其他)应用程序中调用此init函数,我在第一篇文章中通过添加事件循环的exec来处理代码。

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

感谢彼得的反馈。