2012-08-08 1 views
2

У меня есть dll, где я хочу сделать некоторую сеть, эта DLL вызывается из приложения C# как неуправляемая DLL. Вся инициализация работает нормально, но она зависает каждый раз, когда предполагается запустить -> get(). У меня есть этот код:QNetworkAccessManager-> get freezes при вызове в 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(). Я что-то пропустил или это просто невозможно через DLL?

+0

Работает ли тот же код, если он не вызван из неуправляемой библиотеки DLL? т. е. написать небольшое консольное приложение на C++ и вызвать тот же код и посмотреть, что произойдет. –

+0

Спасибо за ваш быстрый ответ. Да, я создал консольное приложение через Qt, и тогда он отлично работает ... Интересно, может ли это иметь какое-то отношение к этому, я не запускаю QApplication в моей неуправляемой DLL, но просто выполняю вызов класса ..? –

+0

Итак, вы * не * создали собственное консольное приложение и вызывают тот же код. Если все, что вы вызываете в своем родном приложении, это опубликованный код, и у вас такая же проблема, вы знаете, в чем проблема. –

ответ

0

Okey, поэтому я получил эту работу, и я решил поделиться своими знаниями. С моей неуправляемой 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# приложение (или любой другой), прежде чем я пытался любой сети я получил его работы с кодом в мой первый пост, добавив 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 dll, libeay32.dll и ssleay32.dll. Win32 LoadLibrary висит весь процесс, пользовательский интерфейс, слоты сигналов, все, в то время как он пытается загрузить эти DLL. Скопируйте эти DLL в каталог исполняемого файла, и нагрузка быстро удастся.