Bonjour,
Je me suis lancé dans la création d'une DLL pour créer une extension shell pour explorer sous windows.
Je suis parti depuis ce tutoriel : http://www.qtcentre.org/threads/3210...source-edition
L'ajout d'overlay sur les icones fonctionne correctement.
Ensuite, je me suis lancé dans une extension plus complexe : Namespace Shell Extension (en gros, un folder virtuel comme le Google Drive par exemple).
Ca fonctionne pas mal mais j'aimerais pouvoir récupérer des listes de fichiers/dossiers d'un serveur.
Donc, dans cette optique, je veux ajouter un QTcpSocket qui se connecte à une application standalone.
Voici mes différents essais:
1/ La création du QTcpSocket en variable globale dans le thread principal (dans DllMain) de l'extension ne fonctionne pas.
Je peux voir une connection du QTcpSocket au serveur mais après c'est tout. Le thread principal bloque sans doute; ce que je peux comprendre.
2/ J'ai donc opté pour la création d'un thread pour contenir mon QTcpSocket.
Pour cela; j'ai tenté la création de QThread mais il ne fonctionne pas non plus. C'est comme ci il bloquait.
Le résultat est le même qu'au point 1/.
3/ Apres des recherches sur internet, j'ai trouvé une solution avec _beginthread.
Le socket fonctionne correctement. Je peux voir qu'il se connecte au serveur avec succès. Je peux envoyer ou recevoir des données dans le thread sans problème.
voici le code utilisé:
Mon soucis est que cette solution _beginthread ne me permet plus d'utiliser la méthode des signals/slots comme avec QThread.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 void CreateThread(void * param) { // creation du QTcpSocket // + boucle pour garder le thread fonctionnel } STDAPI_(BOOL) DllMain(HINSTANCE hInstance, DWORD dwReason, void *) { if (dwReason == DLL_PROCESS_ATTACH) { g_hInst = hInstance; DisableThreadLibraryCalls(hInstance); g_thread = (HANDLE) _beginthread( CreateThread, 0, NULL); } }
Je ne peux donc pas interagir avec le QTcpSocket pour lui faire envoyer des donnees ou récuperer les données depuis le thread principal.
Or, les fonctions appellées par explorer se trouve dans le thread principal.
Auriez vous une piste pour moi?
- Est il possible de faire fonctionner QThread pour remplacer _beginthread et alors récupérer les bienfaits des signals/slots ?
- Si _beginthread est la seule solution, est il possible d'établir une interaction avec le QTcpSocket situé dans ce thread?
Merci d'avance pour vos lumières!
Cordialement
Partager