Toon posts:

[C / Win32] Een ander programma afsluiten *

Pagina: 1
Acties:
  • 67 views sinds 30-01-2008

Verwijderd

Topicstarter
Hee mensen,

Ik ben bezig met een beheerprogramma(in de taal C).
Nu is het de bedoeling dat het een ander programma afsluit.
Maar bepaalde programma's vragen nog om een bevestiging voor het afsluiten.
Heeft er iemand een stukje code voor het afsluiten van dit soort programma's?

m.v.g Rober.


edit:

Jawel, maar alleen met TerminateProcess(), ik weet niet welke parameters deze functie moet hebben, en of ik er eerst een Findwindow() voor nodig heb... Ik heb hier namelijk geen MSDN bij de hand, en die op msdn.com is niet al te best.

[ Voor 31% gewijzigd door Verwijderd op 19-07-2004 19:18 ]


  • simon
  • Registratie: Maart 2002
  • Laatst online: 23-05 18:11
Kun je niet het process van het programma killen?
Robert zoek eens op process termination ofzo op Google, vind je wel wat :P

[ Voor 44% gewijzigd door simon op 19-07-2004 19:18 ]

|>


  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Gebruik je win32? Je kan dit probleem dan oplossen door het verkrijgen van de window handle (bijv. dmv FindWindow) en dan ofwel het sturen van een WM_QUIT message dacht ik (maar dan krijg je mogelijk toch nog een vraag bij het afsluiten), of het uitvoeren van een TerminateWindow().

Met de standaard C bibliotheken krijg je dit niet voor elkaar.

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


Verwijderd

Topicstarter
Hmm... met TerminateProcess(), ik weet niet welke parameters deze functie moet hebben, en of ik er eerst een Findwindow() voor nodig heb... Ik heb hier namelijk geen MSDN bij de hand, en die op msdn.com is niet al te best.
Ik heb geweten hoe dit moest... Ben het kwijt... kan het ook niet vinden op google.nl,
Nog een slimmerik die het zo ff weet?

[ Voor 122% gewijzigd door Verwijderd op 19-07-2004 19:22 ]


  • simon
  • Registratie: Maart 2002
  • Laatst online: 23-05 18:11
Volgens mij heeft elk process een id, en moet je die achterhalen, waarna je het process killt (linux woord; win woord is terminate :P)

|>


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 14:53

NMe

Quia Ego Sic Dico.

Verwijderd schreef op 19 juli 2004 @ 19:20:
Hmm... met TerminateProcess(), ik weet niet welke parameters deze functie moet hebben, en of ik er eerst een Findwindow() voor nodig heb... Ik heb hier namelijk geen MSDN bij de hand, en die op msdn.com is niet al te best.
Nog een slimmerik die het zo ff weet?
Dit artikel lijkt me anders vrij duidelijk? :?

[ Voor 55% gewijzigd door NMe op 19-07-2004 19:22 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
Niet vrij duidelijk, ik weet gewoon de naam van het programma en het moet gewoon worden afgesloten, ik ben opzich niet zo heel erg met WinAPI bezig dus veel verstand heb ik daar niet van...

  • Creepy
  • Registratie: Juni 2001
  • Nu online

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op 19 juli 2004 @ 19:23:
Niet vrij duidelijk, ik weet gewoon de naam van het programma en het moet gewoon worden afgesloten, ik ben opzich niet zo heel erg met WinAPI bezig dus veel verstand heb ik daar niet van...
Dat zul je dus moeten leren ;)
Je zult namelijk bij de naam het proces ID moeten zoeken en dan dat ID gebruiken in TerminateProcess.

Hint: http://msdn.microsoft.com...erating_all_processes.asp

En als dat niet duidelijk genoeg is, dan kan je het beter opgeven gok ik :Y)

[ Voor 7% gewijzigd door Creepy op 19-07-2004 21:20 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Opgeven? We zijn niet allemaal zo nederlands als u. Ga postzegels verzamelen. :Y)

Ontdek het verhaal achter de postzegel;

http://www.tpgpost.nl/voo...gels_verzamelen/index.jsp _/-\o_

[ Voor 47% gewijzigd door Verwijderd op 19-07-2004 21:57 ]


  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Verwijderd schreef op 19 juli 2004 @ 21:53:
Opgeven? We zijn niet allemaal zo nederlands als u. Ga postzegels verzamelen. :Y)

Ontdek het verhaal achter de postzegel;

http://www.tpgpost.nl/voo...gels_verzamelen/index.jsp _/-\o_
Sorry, maar deze reply vind ik een beetje op een flame lijken. Hij wil je helpen en dan ga je zo reageren. |:(

Trouwens wat is er moeilijk aan deze pagina:
http://msdn.microsoft.com...base/terminateprocess.asp

Deze procedure moet je gewoon gebruiken in combinatie met andere procedures.

Ik programmeer zelf geen C dus weet niet echt precies hoe of wat, maar ik zal wat proberen uit te leggen.

Je kunt namelijk de handle van een process vinden met Findwindow('processnaam'). En met GetExitCodeProcess(handle, pointerexitcode). Dan kun je dus met terminateprocess(handle, exitcode) het process killen.

Dus pseudo code:
C:
1
2
3
4
5
6
HANDLE ProcHandle;
UINT ECode;

ProcHandle = FindWindow('ProgrammaNaam');
GetExitCodeProcess(ProcHandle, ECode);
TerminateProcess(ProcHandle, ECode);


Ik snap dus niet wat hier moeilijk aan is. Ik heb nog nooit C geprogd en ik kan het zelfs opmaken uit msdn. Maar wat snap jij hier niet aan dan :?

[ Voor 9% gewijzigd door eghie op 19-07-2004 22:16 ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Het probleem van de TS lijkt me duidelijk. Hij wil een ander proces afsluiten, en dat reageert (met een dialoog, of anderzins). Nou is het me pas volledig duidelijk geworden nadat hij melde dat hij [C | Win32] bedoelde, maar alla, volgende titel meer wijsheid toegewenst.

De eerste vraag die je moet stellen is, wil je antwoord geven op die vraag of de vraag negeren? Als je'm negeert wordt de user misschien wel erg boos dat Word in de "Wilt u de wijzigingen opslaan?" dialoog wordt gekilled, met 3 uur verloren werk.

Aangenomen dat je dus een antwoord wil geven is de vraag, welk? Weet je welk programma? Zo ja, dan had dat vast in de TS gestaan. Zo nee, dan heb je dus een serieus probleem. Je hebt geen idee wat voor dialoog er staat. Je hebt misschien niet eens een idee of het een Franse of een Duitse dialoog is. Het zou zelfs kunnen dat je geen dialoog hebt, maar dat het mainwindow wordt gerecycled (bijvoorbeeld bij spellen gebruikelijk).
Kortom, niet iets waar je blij van wordt.

De laatste vraag die je je dan moet stellen is, wil ik dit eigenlijk wel en waarom dan wel?

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20:27

gorgi_19

Kruimeltjes zijn weer op :9

* gorgi_19 'leent' rustig de titel van MSalters.... :+
oftewel: kleine titlechange :)

[ Voor 5% gewijzigd door gorgi_19 op 19-07-2004 22:17 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

MSalters schreef op 19 juli 2004 @ 22:15:
Het probleem van de TS lijkt me duidelijk. Hij wil een ander proces afsluiten, en dat reageert (met een dialoog, of anderzins). Nou is het me pas volledig duidelijk geworden nadat hij melde dat hij [C | Win32] bedoelde, maar alla, volgende titel meer wijsheid toegewenst.

De eerste vraag die je moet stellen is, wil je antwoord geven op die vraag of de vraag negeren? Als je'm negeert wordt de user misschien wel erg boos dat Word in de "Wilt u de wijzigingen opslaan?" dialoog wordt gekilled, met 3 uur verloren werk.

Aangenomen dat je dus een antwoord wil geven is de vraag, welk? Weet je welk programma? Zo ja, dan had dat vast in de TS gestaan. Zo nee, dan heb je dus een serieus probleem. Je hebt geen idee wat voor dialoog er staat. Je hebt misschien niet eens een idee of het een Franse of een Duitse dialoog is. Het zou zelfs kunnen dat je geen dialoog hebt, maar dat het mainwindow wordt gerecycled (bijvoorbeeld bij spellen gebruikelijk).
Kortom, niet iets waar je blij van wordt.

De laatste vraag die je je dan moet stellen is, wil ik dit eigenlijk wel en waarom dan wel?
Verwijderd schreef op 19 juli 2004 @ 19:23:
Niet vrij duidelijk, ik weet gewoon de naam van het programma en het moet gewoon worden afgesloten, ik ben opzich niet zo heel erg met WinAPI bezig dus veel verstand heb ik daar niet van...
Dus hij weet blijkbaar al welk programma.

Nu begin ik er dus ook al iets meer van te begrijpen. Ik heb het dus waarschijnlijk iets verkeerd begrepen.

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
De vraag is bovendien nog of het antwoord op de bevestiging uitmaakt ja of nee. Je kan met (ik meen DestoryWindow() of was het nou het sturen van een WM_DESTROY...) het window sluiten zonder dat de mogelijkheid tot het stellen van de vraag wordt geboden.

Er wordt geen gelegenheid geboden tot het annuleren van het sluiten. Maar een normaal programam sluit (als het goed is) wel op een nette(re) manier af op deze manier dan lukraak het process de dood in jagen.

Als je ook nog een anwoord moet geven op de bevestiging wordt het interessanter... maar mijn glazen bol heeft zo het vermoeden dat dat laatste niet zo uitmaakt.

[ Voor 15% gewijzigd door Infinitive op 19-07-2004 22:42 ]

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
WM_DESTROY is net zoals WM_QUIT een windows message. Die message komt gewoon bij de message pump, en die kan er al dan niet iets mee doen. De default is teruggeven. Alleen, de eerste google hit vertelt je al dat het geen verzoek is om een applcatie te sluiten. Het is een progress message die Windows intern gebruikt tijdens het sluten. Andere processen zullen daardoor gestoord wroden, niet doen dus.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Even wat anders
Verwijderd schreef op 19 juli 2004 @ 19:07:
Jawel, maar alleen met TerminateProcess(), ik weet niet welke parameters deze functie moet hebben, en of ik er eerst een Findwindow() voor nodig heb... Ik heb hier namelijk geen MSDN bij de hand, en die op msdn.com is niet al te best.
Dat is gewoon vette pech hebben. GoT is geen vraagbaak voor vragen die in de manual staan die je toevallig net even niet bij de hand hebt. Dan zorg je maar dat je die wel bij de hand hebt, en ondanks dat de online MSDN idd wat vervelender is dan de offline variant voldoet hij toch prima om even op te zoeken hoe een bepaalde functie werkt. Ik laat je topic open omdat de discussie die MSalters aanslingert imho wel een interessante is, maar begrijp goed dat het echt geenzins de bedoeling is om de vragen die je gewoon in de documentatie kunt vinden hier op GoT te stellen, ookal heb jij even geen beschikking tot die documentatie.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
ik wil het negeren.
en ik weet welk programma.

  • Creepy
  • Registratie: Juni 2001
  • Nu online

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op 20 juli 2004 @ 08:41:
ik wil het negeren.
en ik weet welk programma.
* Creepy is geen filatelist. :)

Nu we dat hebben gehad: Wat is nu nog je probleem? Met de link die ik je gaf kan je alle processen langs gaan, z'n naam checken, en dan m.b.v. het ProcessId het proces proberen te beeindigen.

[ Voor 6% gewijzigd door Creepy op 20-07-2004 08:46 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
MSalters schreef op 19 juli 2004 @ 23:37:
WM_DESTROY is net zoals WM_QUIT een windows message. Die message komt gewoon bij de message pump, en die kan er al dan niet iets mee doen. De default is teruggeven. Alleen, de eerste google hit vertelt je al dat het geen verzoek is om een applcatie te sluiten. Het is een progress message die Windows intern gebruikt tijdens het sluten. Andere processen zullen daardoor gestoord wroden, niet doen dus.
You can use the DestroyWindow function to destroy a window. Typically, an application sends the WM_CLOSE message before destroying a window, giving the window the opportunity to prompt the user for confirmation before the window is destroyed. A window that includes a window menu automatically receives the WM_CLOSE message when the user clicks Close from the window menu. If the user confirms that the window should be destroyed, the application calls DestroyWindow. The system sends the WM_DESTROY message to the window after removing it from the screen. In response to WM_DESTROY, the window saves its data and frees any resources it allocated. A main window concludes its processing of WM_DESTROY by calling the PostQuitMessage function to quit the application.
Als je een DestroyWindow() stuurt dan gaat 'ie echt plat, tenzij je daar op message pump niveau iets tegen doet...
Je bypassed op deze manier de mogelijkheid van het programma om op WM_CLOSE te reageern. Als het programma daar iets essentieels uitvoerd gaat het niet goed natuurlijk. Maar als ik zo die quote van MSDN lees, dan zou dit eigenlijk niet zo vaak voorkomen. Ik heb als test een aantal applicaties op deze manier onder handen genomen (notepad, word, navision) en heb daarbij geen problemen gemerkt.

[ Voor 7% gewijzigd door Infinitive op 20-07-2004 08:52 ]

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


Verwijderd

Even voor de duidelijkheid: het sturen van WM_CLOSE stuurt een "ga alsjeblieft weg venster" bericht. Het venster kan daarop reageren door de gebruiker een "eej, weet je het zeker" dialoog voor te schotelen.

WM_DESTROY en WM_QUIT doen dit niet. Daar gaat het ding gewoon van dood. Het verschil er tussen weet ik niet precies; WM_QUIT zorgt er in elk geval voor dat de message-loop wordt afgesloten, WM_DESTROY is er volgens mij om tegen vensters te zeggen "ruim jezelf eens op". Dus extra gealloceerd geheugen vrijgeven. Nou is dat over het algemeen geen probleem, want als je proces doodgaat, komt het geheugen vanzelf vrij. Ook weet ik niet precies in welke volgorde deze twee messages gestuurd worden, maar in elk geval nà WM_CLOSE.

Je kan natuurlijk ook het proces killen. Dit is niet netjes, er wordt niks ordelijk afgesloten, het proces wordt gewoon afgekapt. Dat doe je met TerminateProcess(), zoals gezegd.

Voor het eerste heb je een Window Handle nodig, voor het tweede een Process Handle. Volgens mij kun je van een Window Handle een bijbehorende Process Handle krijgen met GetProcess, maar dat weet ik niet precies; moet je even op MSDN kijken. Als je trouwens Delphi hebt, pak dan lekker de Win32 Programmer's Reference die je daarbij krijgt. Dat is MSDN op je eigen hardeschijf, en een stuk sneller dan Microsoft's brakke site (Hij zoekt ook een stuk fijner).

Merk trouwens op dat een proces meerdere vensters kan bevatten/aanmaken. Misschien niet heel relevant, maar tis maar dat je 't weet.

Verwijderd

Topicstarter
Kijk hier heb ik wat aan,
die Findwindow krijgt ook een string mee... Moet dit de titel van het programma zijn dat links boven in het menu van het programma wordt weergegeven?
die MSDN is echt sucks als je met een modempje zit te internetten.

Robert.

Verwijderd

Kàn. FindWindow accepteert 2 parameters. Je mag één van tweeën gebruiken, of allebei.

De eerste is de Window Title. Dat is inderdaad wat er in de titelbalk van je venster staat. Volgens mij mag het zelfs een deel ervan zijn, dus hoeft het niet precies te matchen.

De tweede is de Class name. Elk venster in Windows is gebaseerd op een bepaalde (venster)klasse, en die is geregistreerd onder een bepaalde naam. Met deze parameter kun je dus een venster van een bepaald type vinden, ongeacht de window title. De Window Title kan namelijk veranderen, de Window Class verandert nooit. Voorbeeldje: Internet Explorer vensters zijn van de klasse "IEFrame". Let wel op dat als er meerdere vensters van dezelfde klasse zijn, je er non-deterministisch één krijgt. Waarschijnlijk is het de eerste die aangemaakt is, maar hier moet ik je wederom de details schuldig blijven.

Hoe kom je achter de klasse? Nou, je zou bijvoorbeeld WinSight of Spy++ kunnen gebruiken. Of als je die niet hebt, het gratis WinSpector kunnen downloaden. Met die programma's kun je vensters aanwijzen en daarvan de Window Class achterhalen.

Ik doe dit uit mijn blote bol; als ik zelf moet programmeren pak ik er altijd de documentatie bij om het nog even te controleren. Dat zou ik dus ook doen als ik jou was (oftewel: niet alles klakkeloos van me aannemen ;)).

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20:27

gorgi_19

Kruimeltjes zijn weer op :9

Verwijderd schreef op 20 juli 2004 @ 09:36:
Kijk hier heb ik wat aan,
die Findwindow krijgt ook een string mee... Moet dit de titel van het programma zijn dat links boven in het menu van het programma wordt weergegeven?
die MSDN is echt sucks als je met een modempje zit te internetten.

Robert.
Ik dacht dat .oisyn in [rml].oisyn in "[ C / Win32] Een ander programma afsluite..."[/rml] vrij duidelijk was over vragen die je letterlijk op MSDN kan vinden. GoT is geen plek waar je mensen met een sneller modem dan jij kan laten zoeken in MSDN. :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Misschien dat het onbewust toch nog een goeie vraag was ;).

Als hij namelijk niet wist wat de parameters voor FindWindow waren, betwijfel ik het of hij wist wat Window Classes zijn en dan was-'ie vanzelf wel weer terug gekomen :p.

[ Voor 64% gewijzigd door Verwijderd op 20-07-2004 10:09 ]


  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Bij findwindow kun je ook de naam gebruiken die in je taskmanager staat. Dus bij IE iexplorer.exe. Tenminste ik dacht wel dat dat kon.

Ow en ik snap nu nog steeds niet helemaal je probleem, want je weet welk programma en je weet ook het antwoord. Wat is dan nog je probleem :?

[ Voor 36% gewijzigd door eghie op 20-07-2004 10:39 ]


  • schoene
  • Registratie: Maart 2003
  • Laatst online: 22-05 12:29
Misschien kan dit artikel ook interessant zijn:

A Safer Alternative to TerminateProcess()
Killing an external process on Win32 is just such a beast. Although TerminateProcess() is available, it has serious drawbacks that make it dangerous to use as a general-purpose solution. Other approaches, such as sending a specific message to the application's main window, work only in limited situations and have problems of their own. Luckily, there is an alternative that uses only documented Win32 APIs and doesn't have any serious drawbacks. This article will explain the problems with the obvious solutions mentioned, and present an implementation of a different approach that avoids these problems.
(je moet je wel registreren op de website)

[ Voor 7% gewijzigd door schoene op 20-07-2004 10:52 ]


Verwijderd

Topicstarter
unsigned long int* lProcessID = new unsigned long int;
unsigned long int* lProcess = new unsigned long int;

HWND hWnd = FindWindow("classenaam","vensternaam");
GetWindowThreadProcessId(hWnd, lProcessID);
lProcess = (unsigned long *)OpenProcess(0, false, *lProcessID);
TerminateProcess(lProcess, 0);
CloseHandle(lProcess);


Oke, ik heb hier maar voor gekozen...
Toch sluit mijn programma niet het andere programma af... Kan iemand me nog even vertellen wat er hier niet goed is dan? Ervan uitgaand dat de classenaam en het vensternaam kloppend zijn :)
???
Robert.

  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Ik denk dit stukje: TerminateProcess(lProcess, 0);
Dit omdat 0 waarschijnlijk geen geldige exitcode is. Om wel een geldige exitcode te krijgen kun je dit: GetExitCodeProcess(lProcess, ECode); gebruiken, waarbij dus ECode de exitcode word teruggeven.

Verwijderd

Topicstarter
Sorrie, maar hij werkt echt niet, hij sluit ook geen andere programma's af, het stukje code is dus niet goed... iemand die hem wel kan corrigeren? :/

Verwijderd

Truuk à la truuk: Check resultcodes!

(*kuch*)

Als een functie faalt poep je het resultaat van GetLastError() uit, en dan gebruik je het programmaatje ErrLookup[1] om te kijken wat die fout betekent. Of je gebruikt FormatMessage(), waar je natuurlijk al làng een eigen library-routine voor geschreven hebt :p.

Misschien dat er in C ook gewoon een functie voor is... ik zou het niet weten want ik gebruik Delphi :).

[edit]Uit de documentatie van TerminateProcess:
hProcess
[in] Handle to the process to terminate.
The handle must have the PROCESS_TERMINATE access right. For more information, see Process Security and Access Rights.
Dat moet je dus invullen bij OpenProcess.


[1] Dit krijg je standaard bij MSVC. Misschien dat er ook vrij beschikbare tooltjes voor zijn, dat weet ik zo niet.

[ Voor 48% gewijzigd door Verwijderd op 20-07-2004 13:43 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik word je een beetje zat. Als je de documentatie gewoon gelezen had had je kunnen zien dat OpenProcess als eerste parameter een access flag wil hebben. Jij geeft 0, wat dus aangeeft dat je niets met het proces wil doen (en je kunt dus verder ook niets doen). Zorg dat je de benodigde access flags meegeeft (zie MSDN). En als je nou gewoon errorcodes had gecontroleerd dan had je dat ook kunnen raden. Ik gooi je topic dan ook gewoon op slot want zo komen we natuurlijk nergens, je kan niet van ons verwachten dat wij je gewoon je handje vasthouden en je er doorheen slepen, je zult wel iets zelf moeten doen. Veel succes.

[ Voor 8% gewijzigd door .oisyn op 20-07-2004 13:47 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Eigenlijk moeten we luiheid niet belonen, maar in de grote machtige GoT-search had je deze best kunnen vinden: [rml]curry684 in "[ Delphi]Opgestarte programma afsluiten"[/rml]

Professionele website nodig?

Pagina: 1

Dit topic is gesloten.