C++ (Qt)bool DllMain( HINSTANCE hModule, DWORD ul_reason_for_call, LPVOID lpReserved){ int argc = 0; switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: qDebug()<<"InDaDLL!"; if (qApp == 0) { new QCoreApplication(argc, 0); client = new Client(); CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)DllInit, NULL, 0, 0); } break; case DLL_PROCESS_DETACH: delete client; delete qApp; break; } return TRUE;} DWORD DllInit(LPVOID){ return QCoreApplication::exec();}
C++ (Qt) // Метод, выполняющий попытку подключения к серверу int CLIENTSHARED_EXPORT connectToServer(); // Принудительное отключение клиента int CLIENTSHARED_EXPORT disconnectFromServer(); // Установка сетевых настроек для клиента int CLIENTSHARED_EXPORT setParameters(char* serverAddress, int port); // Состояние клиента int CLIENTSHARED_EXPORT isConnected(); // Отправка сообщения серверу о готовности клиента к получению данных int CLIENTSHARED_EXPORT sendClientIsReady(); // Отправка пакета с информацией об имени отображаемого в память файла int CLIENTSHARED_EXPORT sendMMFPackage(char* MMFName); // Отправка данных об элементе для регистрации на сервере int CLIENTSHARED_EXPORT sendRegInfoPackage(int elementID, int count, int* startBytes, int* bytesCount); // Отправка запроса на получение описания к элементу int CLIENTSHARED_EXPORT sendDBRequestPackage(int elementID, int startByte, int startBit, int bitsCount); // Установка буфера для сброса полученной информации int CLIENTSHARED_EXPORT setBuffer(char* buffer);
C++ (Qt)DWORD __stdcall threadProc(LPVOID){ int i = 0; QCoreApplication app(i, 0); MyObject *tmp = new MyObject; QTcpSocket *socket = new QTcpSocket; QObject::connect(socket, SIGNAL(connected()), tmp, SLOT(clientConnected())); socket->connectToHost("ya.ru", 80); return app.exec();} int main(int argc, char *argv[]){ DWORD d; CreateThread(0, 0, threadProc, 0, 0, &d); system("pause");}
C++ (Qt)int DLLStart(){ CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)DllInit, NULL, 0, 0); return 0;} DWORD DllInit(LPVOID){ int argc = 0; QCoreApplication app(argc, 0); client = new Client(); return app.exec();}
C++ (Qt)int main(){ DLLinit(); char* serverAddress = "192.168.0.10"; char* MMFName = "Global\\DataFile_001.mkio"; setParameters(serverAddress, 5525); ^^^// Тут программа начинает возмущаться: QObject: Cannot create children for a parent that is in a different thread.// (Parent is QTcpSocket(0x1), parent's thread is QThread(0x2), current thread is QThread(0x3). return 0;}
C++ (Qt)#ifndef DLLWRAPPER_H#define DLLWRAPPER_H class DLLWrapper{public: static bool init(HINSTANCE inst = NULL); static void uninit(); private: DLLWrapper();}; #endif // DLLWRAPPER_H
C++ (Qt)#include <QApplication>#include "DLLWrapper.h" HHOOK hook = 0; LRESULT CALLBACK hook_callback(int code, WPARAM wParam, LPARAM lParam){ if (qApp) qApp->sendPostedEvents(); return CallNextHookEx(hook, code, wParam, lParam);}//------------------------------------------------------------------------------//------------------------------------------------------------------------------ bool DLLWrapper::init(HINSTANCE inst){ // Do nothing if already if (qApp) return false; QT_WA({ hook = SetWindowsHookExW(WH_GETMESSAGE, hook_callback, 0, GetCurrentThreadId()); }, { hook = SetWindowsHookExA(WH_GETMESSAGE, hook_callback, 0, GetCurrentThreadId()); }); if (!hook) return false; int argc = 0; new QApplication(argc, 0); return true;}//------------------------------------------------------------------------------ void DLLWrapper::uninit(){ if (hook) { UnhookWindowsHookEx(hook); hook = 0; }}//------------------------------------------------------------------------------
C++ (Qt)bool DllMain( HINSTANCE hModule, DWORD ul_reason_for_call, LPVOID lpReserved){ switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: DLLWrapper::init(hModule); ... break; case DLL_PROCESS_DETACH: ... DLLWrapper::uninit(); delete qApp; break; } return TRUE;}