2

我有一个 dll,我想在其中进行一些网络连接,这个 dll 作为非托管 DLL 从 C# 应用程序调用。所有初始化工作正常,但每次 ->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() 方法时它会完全冻结。我是否错过了什么,或者这只是通过 DLL 是不可能的?

4

2 回答 2

1

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

于 2013-02-20T00:37:57.813 回答
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#(或其他)应用程序中调用这个 init 函数,我通过添加事件循环的 exec 使其与我第一篇文章中的代码一起工作。

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

感谢彼得的反馈。

于 2012-08-09T09:05:47.530 回答