c ++ - SendMessage () WINAPI bliver hængt, når den bruges til at oprette forbindelse til en DDE-server

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en DDE-klientapp, der forbinder til DDE-serverappen ved hjælp af SendMessage() WINAPI. Efter SendMessage() opkaldet, der bliver hængt, mens du anmoder om forbindelse til DDE-serveren. Både DDE Client app og server app er i VC ++.


SendMessage((HWND) -1,WM\_DDE\_INITIATE,(WPARAM) m\_hWnd,MAKELPARAM(hService,hTopic));


Nu hvad gør SendMessage() det hængende? Dybest set er det udsendelse af WM\_DDE\_INITIATE vinduesbesked til alle vinduerne i systemet. Vinduet (DDE-serveren), som det er beregnet til, skal behandle meddelelsen og skulle svare med en bekræftelse. Når bekræftelsen er modtaget SendMessage(), er opkald afsluttet, og klienten er tilsluttet.


I vores tilfælde bliver det hængende og vender aldrig tilbage, og derfor har vi DDE Client-applikationen hængende.


Jeg søgte på nettet og fandt ud af at brugen af ​​SendMessage() til udsendelse normalt ikke anbefales, da det hænger mange gange.


Jeg har kode til DDE-klientens app og DDE-serverapp med mig.


Lad mig vide, er der en eller anden måde at hente DDE-serverens vindueshåndtag på eller på en måde at tildele et unikt navn til DDE-servervinduet.


Ved at gøre dette tror jeg på klientens ende, at jeg kan hente vindueshåndtaget DDE-server fra et unikt navn (ved hjælp af FindWindow() winapi) og i stedet for at sende med SendMessage() kan jeg sende beskeden direkte til DDE-serveren ved hjælp af vindueshåndtag.


Hvis du føler dig over fremgangsmåden til at få vindueshåndtag DDE-serveren ikke er mulig eller ikke anbefales, så lad mig vide en anden metode til at bruge SendMessage() winapi til at oprette forbindelse til DDE Server.

Bedste reference


Brug SendMessageTimeout i stedet for SendMessage, så de hængte apps ikke vil hænge dig.

Andre referencer 1


Hvis en anden proces, enhver proces , sover i deres brugergrænseflade og ikke behandler meddelelser, vil udsendelsesmeddelelser hænge. Endnu en anden grund til at stoppe med at bruge DDE; det er en tilbagevenden fra 16-bit Windows-tiden, da udsendelsesbeskeder var helt sikre. [11] [12] [13]


Desværre er dette noget af et grundlæggende problem i DDE. Den anbefalede løsning er simpelthen ikke at bruge DDE; gøre brug af mere moderne metoder såsom navngivne rør, DCOM eller endda TCP sockets. [14] [15]