Avatar billede neocron Nybegynder
08. august 2006 - 21:53 Der er 9 kommentarer og
1 løsning

Programmer imellem

Underlig titel måske, men forhåbentlig giver min forklaring mere ide på det jeg forsøger at lave.

Forestil jer at jeg har to programmer, A og B.

Program A er et simpelt program med en knap "Start Program B". Denne knap skal, når den bliver trykket på, starte Program B.

Program B er et endnu mere simpelt program med en enkelt label "Jeg er program B og du har startet mig fra Program A".


Det, jeg gerne vil have er at man kun er istand til at køre (starte) program B indefra Program A.
Dvs. at hvis jeg dobbeltklikker på ProgramB.exe skal den skrive "Kan kun starte Program B indefra Program A" og derpå terminere afviklingen af program B.

Hvis jeg derimod starter Program A og trykker på knappen skal Program B åbne og afvikles normalt.

Kort og godt skal Program B være 110% afhængig af Program A. Det skal ikke kunne startes på andre måder end ved at trykke på knappen i Program A.

Giver det mening?
Avatar billede arne_v Ekspert
08. august 2006 - 22:02 #1
jeg tror at det er svaert at lave en sikker loesning

men saadan til normal brug kan du vil krave at program B startes med
et bestemt argument (32 hex digits eller lignende)

som program A kender
Avatar billede neocron Nybegynder
08. august 2006 - 22:10 #2
Okay! Er det lidt henne og lugte af noget i stil af ...main(string[] args) i Console Apps?
Det er Windows Apps begge to. (er ret ny til C#)

Og hvad er et 32 hex digit? Tænker du på 0x00000000000000000000000000000000? :)
Avatar billede arne_v Ekspert
08. august 2006 - 22:23 #3
uden 0x foran

og nok forskelligt fra ene nuller

:-)

men ja args[0]
Avatar billede neocron Nybegynder
09. august 2006 - 17:48 #4
Hej Arne. Beklager det sene svar, men måtte i køjen igår.
Jeg har lidt problemer med den kode.

Når jeg, i Program A klikker på knappen afvikles følgende kode:

private void button1_Click(object sender, EventArgs e)
{
    try
    {
        System.Diagnostics.Process.Start("stdlmgr.exe", "001011101011010110101010101101");
    }
    catch
    {
        MessageBox.Show("Kunne ikke initialisere stdlmgr.exe", "Fejl", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

Som du kan se kalder jeg program B (stdlmgr.exe) med et stk parameter.

Så har vi program B, i Main metoden - Og her går det galt:

[STAThread]
static void Main(string[] args)
{
    if (args[1].Equals("001011101011010110101010101101"))
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
    else
    {
        MessageBox.Show("Dette program kan ikke køres alene.", "Fejl", MessageBoxButtons.OK, MessageBoxIcon.Error);
        Application.Exit();
    }
}

Problemet er, at programmet crasher ("stdlmgr har fundet en fejl og afsluttes"). Det er ikke en exception, men istedet en af Windows' fejl hvor man kan vælge at sende en fejlrapport til Microsoft. Det er jo ikke så godt. Kan du gennemskue hvad jeg gør galt? Fik stirret mig træt i det igår :)
Avatar billede arne_v Ekspert
09. august 2006 - 18:03 #5
if (args[0].Equals("001011101011010110101010101101"))
Avatar billede neocron Nybegynder
09. august 2006 - 18:40 #6
Så virker det med [0] istedet for [1]. Program B starter kun op hvis det aktiveres fra Program A.

Men, hvis jeg prøver at starte Program B selvstændigt, får jeg stadig en "stdlmgr har udført en ulovlig handling og afsluttes".

Har det noget med den MessageBox at gøre?
Avatar billede arne_v Ekspert
09. august 2006 - 18:56 #7
if(args.Length > 0 && args[0].Equals("001011101011010110101010101101"))
Avatar billede neocron Nybegynder
09. august 2006 - 19:17 #8
Opgaven løst til A+ :) Jeg takker mange gange.
Smid et svar!
Avatar billede arne_v Ekspert
09. august 2006 - 19:33 #9
svar
Avatar billede md_craig Nybegynder
11. august 2006 - 13:11 #10
Her er en artikel som nok vil give dig noget lidt mere anvendeligt...

http://www.codeproject.com/csharp/win32processusingwmi.asp

Det er meget fint det med at starte op med parametre, men det er jo så for det første ikke meget svæere end at du kam starte den externet stadig med:

stdlmgr.exe -001011101011010110101010101101

Et andet senarie som måske er uønsket er at man lukker Program A efter man har startet B med det, og B kører lykkeligt videre... (Er naturligvis ikke sikkert det er uønsket)

Artiklen beskriver hvordan du kan hente informationer ud fra andre processer der kører på computeren... yderligere er der mulighed for at supcribe på en række events, som fx process terminated... som gør at du kan afviklet kode i B hvis A lukker...

Du kommer stadig til at starte med en parameter, men istedet for at starte med en statisk parameter, så starter du med en dynamisk, Når du starter A kan du jo få fat i dens ProcessId fx, så kan du når du starter B op lige kigge igennem om det process ID eksistere, og om det nu stæmmer overens med at det er et Program A og ikke Notepad eller Word... eller whatever...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester