Bavarian Nordics vækst blev starten på et DevOps-samarbejde med Novataris for hurtigt at kunne tilpasse IT-organisation til forretningen.
7. december 2023
Slettet bruger
31. maj 2004 - 14:13#1
jeg er bekendt med det her fra swiss det er lidt bøvlet da execute time er en konstant og ikke en variabel som træder ikraft når programmet bliver installeret.
der er en del måder at gøre det på, fx lave en fil som ligger et skjult sted. eller en key i registry som du bruger. Men det er ret nemt at finde begge ting. Du kan også lave så dit program retter i sin egen exe fil, det er lidt svære.
Men hvis nogen ønsker dit program cracket skal de self nok få det. Men ellers syntes jeg bare du skal skrive til registry, det vil de *fleste* jo ikke gå ind at lave om på.
Jeg har noget kode der kan gøre det med dato, så folk kun kan åbne den til og med en hvis dato. Men ellers ville den bedste nok være at skrive til en placering i databasen, hvor den så checker om den har været kørt mere en et hvis antal gange.
Synes godt om
Slettet bruger
31. maj 2004 - 14:53#4
ja det at skrive til databasen er nok bedst, da man så er uafhængig af hvornår programmet er installeret.
har du et eksempel der skriver/læser til registry?
går lige lidt længere tid, har en hulens bunke kode jeg skal have kigget igennem, jeg VED jeg har den, for jeg har selv lavet et program der brugte registreringsdatabasen
denne har jeg lavet til dig (husk at tilføje Registry i uses):
procedure SetRegistryData(RootKey: HKEY; Key, Value: string; RegDataType: TRegDataType; Data: variant); var Reg: TRegistry; s: string; begin Reg := TRegistry.Create(KEY_WRITE); try Reg.RootKey := RootKey; if Reg.OpenKey(Key, True) then begin try if RegDataType = rdUnknown then RegDataType := Reg.GetDataType(Value); if RegDataType = rdString then Reg.WriteString(Value, Data) else if RegDataType = rdExpandString then Reg.WriteExpandString(Value, Data) else if RegDataType = rdInteger then Reg.WriteInteger(Value, Data) else if RegDataType = rdBinary then begin s := Data; Reg.WriteBinaryData(Value, PChar(s)^, Length(s)); end else raise Exception.Create(SysErrorMessage(ERROR_CANTWRITE)); except Reg.CloseKey; raise; end; Reg.CloseKey; end else raise Exception.Create(SysErrorMessage(GetLastError)); finally Reg.Free; end; end;
procedure TForm1.FormCreate(Sender: TObject); var a : string; b : integer; begin with TRegistry.Create do begin RootKey:=HKEY_LOCAL_MACHINE; if OpenKey('SOFTWARE\tester', False) then try a := ReadString('times'); if a = '' then a := '0' else b := StrToInt(a); b := b+1; except MessageDlg('Can not go to handle', mtError, [mbOk], 0); end; CloseKey; end; if a >= '5' then begin Showmessage('Programmet er kørt mere end 5 gange, og lukker'); Application.Terminate; end else begin
procedure TForm1.FormCreate(Sender: TObject); var a : integer; begin with TRegistry.Create do begin RootKey:=HKEY_LOCAL_MACHINE; if OpenKey('SOFTWARE\tester', False) then begin a := 0; try a := ReadInteger('times'); except MessageDlg('Can not go to handle', mtError, [mbOk], 0); end; CloseKey; end; end; if a >= 5 then begin Showmessage('Programmet er kørt mere end 5 gange, og lukker'); Application.Terminate; end else begin SetRegistryData(HKEY_LOCAL_MACHINE, 'Software\tester','times', rdString, a+1); end; end;
procedure TForm1.FormCreate(Sender: TObject); var a : string; b : integer; begin with TRegistry.Create do begin RootKey:=HKEY_LOCAL_MACHINE; if OpenKey('SOFTWARE\tester', False) then begin b := 0; try a := ReadString('times'); except MessageDlg('Can not go to handle', mtError, [mbOk], 0); end; CloseKey; b := StrToInt(a); end; end; if b >= 5 then begin Showmessage('Programmet er kørt mere end 5 gange, og lukker'); Application.Terminate; end else begin SetRegistryData(HKEY_LOCAL_MACHINE, 'Software\tester','times', rdString, IntToStr(b+1)); end; end;
type TForm1 = class(TForm) Label1: TLabel; ProgressBar1: TProgressBar; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure SetRegistryData(RootKey: HKEY; Key, Value: string; RegDataType: TRegDataType; Data: variant); var Reg: TRegistry; s: string; begin Reg := TRegistry.Create(KEY_WRITE); try Reg.RootKey := RootKey; if Reg.OpenKey(Key, True) then begin try if RegDataType = rdUnknown then RegDataType := Reg.GetDataType(Value); if RegDataType = rdString then Reg.WriteString(Value, Data) else if RegDataType = rdExpandString then Reg.WriteExpandString(Value, Data) else if RegDataType = rdInteger then Reg.WriteInteger(Value, Data) else if RegDataType = rdBinary then begin s := Data; Reg.WriteBinaryData(Value, PChar(s)^, Length(s)); end else raise Exception.Create(SysErrorMessage(ERROR_CANTWRITE)); except Reg.CloseKey; raise; end; Reg.CloseKey; end else raise Exception.Create(SysErrorMessage(GetLastError)); finally Reg.Free; end; end;
procedure TForm1.FormCreate(Sender: TObject); var a : string; b : integer; begin with TRegistry.Create do begin RootKey:=HKEY_LOCAL_MACHINE; if OpenKey('SOFTWARE\tester', False) then try a := ReadString('times'); if a = '' then a := '0' else b := StrToInt(a); b := b+1; except MessageDlg('Can not go to handle', mtError, [mbOk], 0); end; CloseKey; end; ProgressBar1.Position := StrToInt(a); if StrToInt(a) >= 100 then begin Showmessage('Programmet er kørt mere end 5 gange, og lukker'); Application.Terminate; end else begin
Jeg prøvede nemlig at sætte den ind i et nyt dokument og der virkede den.
Prøv at gå helt tilbage til starten hvor det virkede -> inden progressbar'en kom med.
Synes godt om
Slettet bruger
31. maj 2004 - 20:25#33
jo det har jeg også prøvet, her er ingen fejl med econvert,
når jeg sætter a til 100 stopper programmet efter 3 forsøg, og i registry står der 2 under "times" nogle gange kom den op til 5 og i 6 forsøg stoppede programmet som det skulle.
efterfølgende forsøg stopper programmet efter 3 forsøg.
okay nu er du helt tilbage til starten uden progressbar osv.
så skriver du
if StrToInt(a) >= 100 then begin
istedet for
if a >= '100' then begin
Synes godt om
Slettet bruger
31. maj 2004 - 21:13#35
så får jeg jo en econverterror når jeg skriver
if StrToInt(a) >= 100
for lige at få styr på alle de indlæg så har jeg brugt dit første eksempel med den ændring som du skriver 20:29:24 hvor jeg så får en EConvertError "is not a valid integer"
prøv evt. at slette hele 'times' i regedit så den slet ikke er der, og så køre programmet.
eller prøv at lave en ny sti sådan at den bliver gemt et andet sted i regedit.
Synes godt om
Slettet bruger
31. maj 2004 - 22:31#39
tror at problemet er her b := StrToInt(a); b := b+1;
b skal jo tælle hvormange programmet startes med +1 , hvis man indsætter et vilkårligt tal bliver det tal lagt i "times" og når b ikke bliver initilized vil b ikke virke...
blot en tanke
forstår simpelhen ikke hvorfor det ikke virker
har prøvet at slette times et utal gange og kørt programmet -- har prøvet at skifte sti hjælper heller ikke noget, hvis jeg bruger "if StrToInt(a) >= 100" når den ikke at skrive til registry for fejlmeldingen EConvertError
du har Dansk XP ik? for det kan være det der er galt, jeg prøvede nemlig lige mit program oppe på min skole (hvor de har dansk XP), og der skrev den det med "" is not a valid integer value.
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.