|
| Automations interface Fra : Anton Vestergaard |
Dato : 17-12-01 12:01 |
|
Hej NG
Jeg er igang med at lave et program der kun må åbnes i en instans på hver
maskine.
Den del har jeg fået løst ved hjælp af noget FindWindow og starte programmet
op i Sub Main.
Yderligere skal jeg kunne reinitialisere programmet ved at kalde programmet
fra et andet program.
Jeg troede at jeg kunne gøre dette på en Quick and Dirty måde ved at
undersøge Commandline i
Sub Main, og så der se efter et R eller lignende, det volder desværre en hel
del problemer.
Jeg har overvejet istedet at lave et automations interface til programmet,
således at man kan kalde
programmet fra et andet program uden at starte en ny instans af programmet.
Jeg har lavet mit program om til en ActiveX Exe fil, og kan godt kalde
funktioner i programmet via
en klassefil, men jeg starter også flere instanser af programmet, og så går
ideen lige som af det!
Hvad jeg har brug for er nogen ideer, tips, links til hvordan man kan gøre
det på den rigtige måde.
mvh
Anton
| |
Jens Vestergaard (17-12-2001)
| Kommentar Fra : Jens Vestergaard |
Dato : 17-12-01 13:31 |
|
"Anton Vestergaard" <anton_dk@hotmail.com> skrev i en meddelelse
news:3c1dd061$0$93406$edfadb0f@dspool01.news.tele.dk...
> Jeg er igang med at lave et program der kun må åbnes i en instans på hver
> maskine.
> Den del har jeg fået løst ved hjælp af noget FindWindow og starte
programmet
> op i Sub Main.
Prøv med App.PrevInstance i stedet for:
If App.PrevInstance Then
MsgBox "Kører allerede"
End if
.... eller noget i den retning.
> Yderligere skal jeg kunne reinitialisere programmet ved at kalde
programmet
> fra et andet program.
> Jeg troede at jeg kunne gøre dette på en Quick and Dirty måde ved at
> undersøge Commandline i
> Sub Main, og så der se efter et R eller lignende, det volder desværre en
hel
If Instr(COMMAND,"/R") > 0 Then
MsgBox "Parameter /R findet i kommandolinien"
End If
--
mvh
Jens Vestergaard
www.railsoft.dk
| |
Anton Vestergaard (17-12-2001)
| Kommentar Fra : Anton Vestergaard |
Dato : 17-12-01 14:41 |
|
Yup. Men det løser ikke opgaven.
Mit program skal udføre en funktion hvis det er åbnet i forvejen (og finder
et R i Commandline).
Når jeg udfører en funktion her startes en ny instans af programmet, dog
uden interface, men den kan findes
i tasklisten.
Men tak.
Anton
"Jens Vestergaard" <j@railsoft.dk> skrev i en meddelelse
news:3c1de568$0$52985$edfadb0f@dspool01.news.tele.dk...
> "Anton Vestergaard" <anton_dk@hotmail.com> skrev i en meddelelse
> news:3c1dd061$0$93406$edfadb0f@dspool01.news.tele.dk...
> > Jeg er igang med at lave et program der kun må åbnes i en instans på
hver
> > maskine.
> > Den del har jeg fået løst ved hjælp af noget FindWindow og starte
> programmet
> > op i Sub Main.
>
> Prøv med App.PrevInstance i stedet for:
> If App.PrevInstance Then
> MsgBox "Kører allerede"
> End if
> ... eller noget i den retning.
>
> > Yderligere skal jeg kunne reinitialisere programmet ved at kalde
> programmet
> > fra et andet program.
> > Jeg troede at jeg kunne gøre dette på en Quick and Dirty måde ved at
> > undersøge Commandline i
> > Sub Main, og så der se efter et R eller lignende, det volder desværre en
> hel
>
>
> If Instr(COMMAND,"/R") > 0 Then
> MsgBox "Parameter /R findet i kommandolinien"
> End If
>
> --
> mvh
> Jens Vestergaard
> www.railsoft.dk
>
>
| |
Tomas Christiansen (17-12-2001)
| Kommentar Fra : Tomas Christiansen |
Dato : 17-12-01 23:16 |
|
Anton Vestergaard skrev:
> Jeg er igang med at lave et program der kun må åbnes i en instans på
hver
> maskine.
....
> Jeg har lavet mit program om til en ActiveX Exe fil, og kan godt
kalde
> funktioner i programmet via
> en klassefil, men jeg starter også flere instanser af programmet, og
så går
> ideen lige som af det!
Du kan lave en lille synkroniseringsobjekt, ved at oprette et ActiveX
EXE projekt (f.eks. prjSynkro) med en klasse (f.eks. clsSynkro) og en
metode (f.eks. Init), som dit program skal kalde når det starter op.
Du skal huske at sætte Instancing til MultiUse på klassen clsSynkro i
prjSynkro ActiveX EXE projektet, og så har du mulighed for dele
indholdet af globale data mellem de enkelte instancer af klassen
(tilføj et standard kode.modul - default navn: Module1.bas - til
formålet).
Med andre ord, hvis du i prjSynkro har variabel i Module1.bas:
Public global As Long
og du hver gang du kalder metoden Init i klassen clsSynkro gør
følgende:
global = global + 1
vil værdien være talt 1 op i ALLE instanser af clsSynkro.
Du vil også kunne bemærke at første gang et program opretter en
instans af clsSynkro, optræder prjSynkro på listen over kørende
programmer, men der kommer ikke flere instanser af prjSynkro til,
selvom nye programmer opretter instanser af clsSynkro. Først når den
sidste instans af clsSynkro nedlægges, stopper programmet prjSynkro.
Husk iøvrigt at gå ind i Project, Properties, Component og vælg
"Binary Compatibility" efter FØRSTE gang du har linket projektet til
en EXE-fil. Så undgår du at få pladret din registreringsbase til med
nye nøgler hver gang projektet linkes!
-------
Tomas
| |
Anton Vestergaard (17-12-2001)
| Kommentar Fra : Anton Vestergaard |
Dato : 17-12-01 23:43 |
|
Ærbødigst tak.
Den sidste del forstår jeg så ikke helt. Men det lærer jeg nok engang.
Det andet virkede ihvertfald helt som det skulle.
Det jeg gjorde forkert var at jeg direkte fra klassen kaldte
en procedure i modulet/formen, hvorved der blev oprettet
en ny instans.
Igen, tak.
Anton
"Tomas Christiansen" <toc@blikroer.removethis.dk> skrev i en meddelelse
news:9vlqqo$2v75$1@news.cybercity.dk...
> Anton Vestergaard skrev:
> > Jeg er igang med at lave et program der kun må åbnes i en instans på
> hver
> > maskine.
> ...
> > Jeg har lavet mit program om til en ActiveX Exe fil, og kan godt
> kalde
> > funktioner i programmet via
> > en klassefil, men jeg starter også flere instanser af programmet, og
> så går
> > ideen lige som af det!
>
> Du kan lave en lille synkroniseringsobjekt, ved at oprette et ActiveX
> EXE projekt (f.eks. prjSynkro) med en klasse (f.eks. clsSynkro) og en
> metode (f.eks. Init), som dit program skal kalde når det starter op.
>
> Du skal huske at sætte Instancing til MultiUse på klassen clsSynkro i
> prjSynkro ActiveX EXE projektet, og så har du mulighed for dele
> indholdet af globale data mellem de enkelte instancer af klassen
> (tilføj et standard kode.modul - default navn: Module1.bas - til
> formålet).
>
> Med andre ord, hvis du i prjSynkro har variabel i Module1.bas:
>
> Public global As Long
>
> og du hver gang du kalder metoden Init i klassen clsSynkro gør
> følgende:
>
> global = global + 1
>
> vil værdien være talt 1 op i ALLE instanser af clsSynkro.
>
> Du vil også kunne bemærke at første gang et program opretter en
> instans af clsSynkro, optræder prjSynkro på listen over kørende
> programmer, men der kommer ikke flere instanser af prjSynkro til,
> selvom nye programmer opretter instanser af clsSynkro. Først når den
> sidste instans af clsSynkro nedlægges, stopper programmet prjSynkro.
>
> Husk iøvrigt at gå ind i Project, Properties, Component og vælg
> "Binary Compatibility" efter FØRSTE gang du har linket projektet til
> en EXE-fil. Så undgår du at få pladret din registreringsbase til med
> nye nøgler hver gang projektet linkes!
>
> -------
> Tomas
>
| |
Tomas Christiansen (18-12-2001)
| Kommentar Fra : Tomas Christiansen |
Dato : 18-12-01 19:20 |
|
Anton Vestergaard skrev:
> Ærbødigst tak.
Selv tak.
> Den sidste del forstår jeg så ikke helt. Men det lærer jeg nok
engang.
Hvis det er noget, som du ønsker uddybet, må du være mere specifik
mht. hvad det er, som du ikke forstår.
-------
Tomas
| |
Anton Vestergaard (19-12-2001)
| Kommentar Fra : Anton Vestergaard |
Dato : 19-12-01 23:23 |
|
Hej Tomas
Det jeg ikke helt forstår er hvorfor man skal vælg Binary Compability efter
første gang man har linket til et andet program.
Jeg vidste heller ikke det med nye nøgler i registreringsdatabasen.
Hvad vil der egentlig ske hvis jeg i programmet (ActiveX Exe) opretter nye
instanser af clsSynkro på samme måde som var det et andet program?
Multithreading?
mvh
Anton
"Tomas Christiansen" <toc@blikroer.removethis.dk> skrev i en meddelelse
news:9vo1eh$2fm$1@news.cybercity.dk...
> Anton Vestergaard skrev:
> > Ærbødigst tak.
>
> Selv tak.
>
> > Den sidste del forstår jeg så ikke helt. Men det lærer jeg nok
> engang.
>
> Hvis det er noget, som du ønsker uddybet, må du være mere specifik
> mht. hvad det er, som du ikke forstår.
>
> -------
> Tomas
>
| |
Tomas Christiansen (22-12-2001)
| Kommentar Fra : Tomas Christiansen |
Dato : 22-12-01 00:06 |
|
Anton Vestergaard skrev:
> Det jeg ikke helt forstår er hvorfor man skal vælg Binary
Compability efter
> første gang man har linket til et andet program.
> Jeg vidste heller ikke det med nye nøgler i registreringsdatabasen.
Problemet er, at standard-opsætningen "Project Compatibility" gør, at
hver gang man linker sit program (File, Make xxx.exe), bliver der
genereret en ny beskrivelse af programmet i registreringsbasen, og den
gamle beskrivelse bliver ikke slettet!
Det næste problem er, at "Binary Compatibility" kun kan sættes, hvis
programmet ER blevet linket en gang (VB skal have noget at sammenligne
med, for at kunne opdage ændringer som medfører inkompatibilitet).
> Hvad vil der egentlig ske hvis jeg i programmet (ActiveX Exe)
opretter nye
> instanser af clsSynkro på samme måde som var det et andet program?
> Multithreading?
Så vidt jeg husker, kun hvis du opretter nye objekter med
CreateObject, når det er indenfor samme projekt, at du får muligheden
for flere tråde, og du får ikke umiddelbart meget ud af at der
oprettes flere tråde. Der vil kun være én af gangen, som rent faktisk
gør noget.
Dette kan man dog komme ud over på flere forskellige måder. F.eks. ved
at bruge en system-timer til at aktivere tråde med, men det er lidt
tricky at få til at virke efter hensigten...
-------
Tomas
| |
Anton Vestergaard (22-12-2001)
| Kommentar Fra : Anton Vestergaard |
Dato : 22-12-01 11:57 |
|
Hej Tomas
Tak for den gode og uddybende forklaring.
mvh
Anton
"Tomas Christiansen" <toc@blikroer.removethis.dk> skrev i en meddelelse
news:a00f7t$2cir$1@news.cybercity.dk...
> Anton Vestergaard skrev:
> > Det jeg ikke helt forstår er hvorfor man skal vælg Binary
> Compability efter
> > første gang man har linket til et andet program.
> > Jeg vidste heller ikke det med nye nøgler i registreringsdatabasen.
>
> Problemet er, at standard-opsætningen "Project Compatibility" gør, at
> hver gang man linker sit program (File, Make xxx.exe), bliver der
> genereret en ny beskrivelse af programmet i registreringsbasen, og den
> gamle beskrivelse bliver ikke slettet!
>
> Det næste problem er, at "Binary Compatibility" kun kan sættes, hvis
> programmet ER blevet linket en gang (VB skal have noget at sammenligne
> med, for at kunne opdage ændringer som medfører inkompatibilitet).
>
> > Hvad vil der egentlig ske hvis jeg i programmet (ActiveX Exe)
> opretter nye
> > instanser af clsSynkro på samme måde som var det et andet program?
> > Multithreading?
>
> Så vidt jeg husker, kun hvis du opretter nye objekter med
> CreateObject, når det er indenfor samme projekt, at du får muligheden
> for flere tråde, og du får ikke umiddelbart meget ud af at der
> oprettes flere tråde. Der vil kun være én af gangen, som rent faktisk
> gør noget.
>
> Dette kan man dog komme ud over på flere forskellige måder. F.eks. ved
> at bruge en system-timer til at aktivere tråde med, men det er lidt
> tricky at få til at virke efter hensigten...
>
> -------
> Tomas
>
| |
|
|