Toon posts:

[VB6 Sluiten appl] SendMessage wil m'n app niet sluiten

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb twee zelf geschreven applicaties.
Een main-programma en een update-programma.
Het update-programma moet, zoals de naam al doet vermoeden, update mijn main-programma als er op een voorgedifineerde plaats op het netwerk een nieuwere versie staat van dat programma.
Als ik het update-programma 'stand-alone' gebruik met meegeving van de argumenten gaat alles prima.
Als ik in mijn main-programma met shell het update-programma aanroep gaat het niet goed omdat het main-programma 'aanblijft' en de kopieeractie van het update-programma daardoor mislukt. Ik kan niet overschrijven omdat de applicatie open is (permission denied). Dit is allemaal zeer begrijpelijk en ik probeer dan ook eerst het main-programma te sluiten alvorens te kopieren.
Dit sluiten krijg ik niet voor elkaar, ik gebruik daarvoor Sendmessage.

Hier eerst wat snipplets ter verduidelijking.

In de Main() van het main-programma:
code:
1
2
3
4
5
6
7
8
9
10
11
12
Public Sub Main()
  If NewVersionAvailable() Then
    'start update programma:
    sProgramm = App.Path & "\update.exe " & _
              argumenten... & _
              App.hInstance
    Call Shell(sProgramm, vbNormalFocus)
    End
  Else
    MDIForm1.Show
  End If  
End Sub


Het update-programma:
code:
1
2
3
4
5
6
7
8
9
Public Function voerUpdateUit()
      'handle van aanroepen applicatie
      'deze sluiten, dit is als argument meegegeven,
      'is de App.hInstance van de aanroepende applicatie:
      lRetval = SendMessage(lHwnd, WM_CLOSE, ByVal 0&, ByVal 0&)
...
     fso.CopyFile sNewFilename, sCurrentfile, True
...
End Function


Het lijkt erop dat lHwnd (App.hInstance van de aanroepende applicatie) niet de juiste handle is. lHwnd is overigens wel met een groot getal gevuld.

Ik zie vast iets over het hoofd, maar ik kom er niet meer uit |:(

Ik heb me al suf gezocht en overal kom ik bovenstaande code tegen.

Hopelijk hebben jullie enige suggesties hoe ik SendMessage wel moet gebruiken.

  • DPLuS
  • Registratie: April 2000
  • Niet online

DPLuS

 

WM_CLOSE werkt SOMS niet.
WM_DESTROY daarentegen wel:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Const WM_DESTROY = &H2 
Const WM_CLOSE = &H10 ' Emuleert ALT+F4

lpClassName = "Mijn_Class_Naam"
lpCaption = vbNullString

'Determine the handle to the window.
Handle = FindWindow(lpClassName$, lpCaption$)

If Handle <> 0 Then
    'Post a message to window to end its existence.
    PostMessage Handle, WM_DESTROY, 0&, 0&
Else
    MsgBox "No handle found for window", vbCritical
End If

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Makkelijker (onder het motto "waarom moeilijk doen als het makkelijk kan"):

In je main shell je het update programma, en meteen daarna sluit je je main app. Zorg dat je, voordat je het update app start al zoveel mogelijk unload. Shell daarna dus je update app en end de rest van je app. Je update app loopt nu gewoon door (zet er desnoods een vertraging van een paar seconden in, of een lus om te kijken of de main app nog draait m.b.v. een SendMessage of FindWindow of whatever), en start na de update procedure gewoon je main app vanuit de update app...

Sim-pel :Y)

edit:

Ik zie nu overigens dat er een End meteen na je shell staat. En toch sluit 'ie niet? Wat heb je er nog meer voor enge dingen in zitten dan?

[ Voor 26% gewijzigd door RobIII op 16-09-2004 17:54 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
@RobIII:
Ik heb er helemaal geen enge dingen in staan. Om dat te voorkomen heb ik de shell in de Main-module gezet. Er is dan nog niets geladen.
@DPLus:
Ik heb WM_DESTROY toegevoegd maar dat mocht ook niet baten.

Ik heb wel een work-around die wel werkt:
code:
1
2
3
4
5
6
7
8
9
10
      lRetval = SendMessage(lHwnd, WM_CLOSE, ByVal 0&, ByVal 0&)
      If lRetval = 0 Then
        Do While lRetval = 0
          Sleep 1000
          lRetval = SendMessage(lHwnd, WM_DESTROY, ByVal 0&, ByVal 0&)
          '10 keer proberen:
          teller = teller + 1
          DoEvents
          If teller = 10 Then Exit Do
        Loop


Nu gaat het wel goed. Maar of het main-programma nu gesloten wordt door mijn update-programma of dat het main-programma zichzelf sluit door de End na de shell weet ik niet, maar het werkt in ieder geval. ;)

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op 17 september 2004 @ 09:06:
@RobIII:
Ik heb er helemaal geen enge dingen in staan. Om dat te voorkomen heb ik de shell in de Main-module gezet. Er is dan nog niets geladen.
@DPLus:
Ik heb WM_DESTROY toegevoegd maar dat mocht ook niet baten.

Ik heb wel een work-around die wel werkt:
code:
1
2
3
4
5
6
7
8
9
10
      lRetval = SendMessage(lHwnd, WM_CLOSE, ByVal 0&, ByVal 0&)
      If lRetval = 0 Then
        Do While lRetval = 0
          Sleep 1000
          lRetval = SendMessage(lHwnd, WM_DESTROY, ByVal 0&, ByVal 0&)
          '10 keer proberen:
          teller = teller + 1
          DoEvents
          If teller = 10 Then Exit Do
        Loop


Nu gaat het wel goed. Maar of het main-programma nu gesloten wordt door mijn update-programma of dat het main-programma zichzelf sluit door de End na de shell weet ik niet, maar het werkt in ieder geval. ;)
Toch een redelijk ranzige oplossing IMHO. Kun je niet eens proberen uit te zoeken wat de oorzaak waarom de main app niet sluit? Wat je nu doet is pure symptoombestrijding en lost niets op aan je initiële probleem.

...En dan die lus uit je code :X
code:
1
2
3
4
5
6
7
8
      teller=0
      lRetval = SendMessage(lHwnd, WM_CLOSE, ByVal 0&, ByVal 0&)
      Do While (lRetval = 0) And (teller<=10)
        lRetval = SendMessage(lHwnd, WM_DESTROY, ByVal 0&, ByVal 0&)
        Sleep 1000
        teller = teller + 1
        DoEvents
      Loop

Doe 't dan op z'n minst zo, i.p.v. een exit do.... :Y) En waarvoor die If-statement?

[ Voor 25% gewijzigd door RobIII op 17-09-2004 13:09 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Volgens mij moet je app eerst de rechten aanvragen /verwerven om een andere applicatie te mogen sluiten... heb zelf zoiets ook eens moeten doen. Zal wel eens zoeken of ik wat code kan terug vinden.

  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Heb even gezocht... was in de war met het afsluiten van heel Windows :) Om een applicatie af te sluiten heb je die extra rechten niet nodig. Heb ook een oplossing om een applicatie te sluiten op een manier die heel veel lijkt op die van de TaskManager. Is alleen wat veel code om hier te posten... als je belangstelling hebt dan wil ik de module best ff mailen.

Verwijderd

Topicstarter
@RobIII:
Je hebt helemaal gelijk met die aanpassingen. Ik was wat te snel en daardoor slordig.

@Lorn:
Ik ben altijd benieuwd naar code, dus als je het wilt mailen graag.

meems@soilcompany.nl

[ Voor 7% gewijzigd door Verwijderd op 17-09-2004 16:49 . Reden: e-mailadres vergeten ;) ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op 17 september 2004 @ 16:46:
@Lorn:
Ik ben altijd benieuwd naar code, dus als je het wilt mailen graag.

meems@soilcompany.nl
Zonder te willen zeuren: Aan deze oplossing heeft natuurlijk niemand iets (en zeker zij die wij straks weer op de search wijzen als ze met eenzelfde vraag komen). Post liever een link naar de originele code, of de belangrijkste stukken uit de code. Post een pointer in de juiste richting, maar doe 't niet via de email...

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

RobIII schreef op 17 september 2004 @ 20:55:
[...]

Zonder te willen zeuren: Aan deze oplossing heeft natuurlijk niemand iets (en zeker zij die wij straks weer op de search wijzen als ze met eenzelfde vraag komen). Post liever een link naar de originele code, of de belangrijkste stukken uit de code. Post een pointer in de juiste richting, maar doe 't niet via de email...
Point well taken. Had er even niet aangedacht dat ik idd ook de file even kon uploaden. Geen beloftes over hoelang de file zal blijven staan, best mogelijk dat die d'r over een jaar niet meer staat. Maar voorlopig is het hier te downloaden.

Disclaimer:
Deze module komt uit een groter project en is niet compleet. Zo staan de API declaraties niet in de module zelf. Het is dus niet een kwestie van de module toevoegen aan je project en gaan met die banaan. De declaraties van alle API-calls zijn te vinden in de API tool van VB of anders ergens op het internet. De module zelf is (redelijk) goed gedocumenteerd. Er zijn 2 publieke functies die aangeroepen kunnen worden dus ik verwacht dat het geheel wel zichzelf duidelijk maakt.

[ Voor 8% gewijzigd door Lorn op 20-09-2004 12:20 ]

Pagina: 1