我有一个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而言根本不可能?
答案 0 :(得分:1)
我的猜测是你的QT库是针对opensll构建的。 QNetworkAccessManager查找ssl dll,libeay32.dll和ssleay32.dll。 Win32 LoadLibrary会挂起整个进程,UI,信号插槽,所有内容,同时尝试加载这些dll。将这些dll复制到可执行文件的目录中,加载将很快成功。
答案 1 :(得分:0)
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 );
感谢彼得的反馈。