Laden...

Aufruf von C-Funktion time in Inno Setup

Erstellt von Caveman vor 7 Jahren Letzter Beitrag vor 7 Jahren 2.296 Views
Caveman Themenstarter:in
187 Beiträge seit 2009
vor 7 Jahren
Aufruf von C-Funktion time in Inno Setup

Hallo,

ich versuche mit über ein Inno-Setup-Skript einen Unix-Timestamp in die Registry zu schreiben.
Leider scheitert das ganze aber offenbar an dem Aufruf der DLL.

Kann mir jemand sagen, was bei dem folgenden Code nicht funktioniert?


[Registry]
Root: "HKLM64"; Subkey: "SOFTWARE\Name\{#MyAppName}"; ValueType: qword; ValueName: "TStamp"; ValueData: "{code:GetUnixTimestamp(0)}"; Flags: createvalueifdoesntexist

[Code]
//Unix Timestamp
function GetUnixTimestamp(ATimerPtr: Int64): Int64; 
external 'time@msvcrt.dll cdecl';

Ich habe den Code von StackOverflow und schon 1000 mal abgewandelt.

Caveman Themenstarter:in
187 Beiträge seit 2009
vor 7 Jahren

Habe nochmals in der Hilfe gelesen. Es werden in der Code-Section nur die Typen String und Boolean unterstützt.

5.657 Beiträge seit 2006
vor 7 Jahren

Hi Caveman,

"funktioniert nicht" ist jetzt auch keine aussagekräftige Fehlermeldung, mit der man dir irgendwie weiterhelfen könnte. Daß du den Code "1000 mal abgewandelt" hast, macht es auch nicht leichter. Aber du hast sicher gesehen, daß in dem von dir verlinkten Code "_time32@msvcrt.dll" verwendet wird?

Weeks of programming can save you hours of planning

4.931 Beiträge seit 2008
vor 7 Jahren

Ist die DLL überhaupt im Systempfad vorhanden? Diese wird ja nur bei einem C bzw. C++ Projekt vom Visual Studio benutzt (deployed).
Kannst mal

where msvcrt.dll

in der DOS-Konsole (Eingabeaufforderung) eingeben.

Caveman Themenstarter:in
187 Beiträge seit 2009
vor 7 Jahren
[gelöst] Aufruf von C-Funktion time in Inno Setup

Hallo,

Danke für die Antworten.
Ja, die Dll ist in Windows\System32 vorhanden.
Inno-Setup kann jedenfalls damit umgehen. Das Problem ist nur, dass in der Code-Section als Rückgabewerte nur String und Boolean erlaubt sind.

Ich hatte gehofft, dass die Inno-Profis hier das auf den ersten Blick sehen.

Meine Lösung ist jetzt eine Konsolenanwendung, die in der Run-Section aufgerufen wird und den Wert in die Registry schreibt.

199 Beiträge seit 2006
vor 7 Jahren

Da muss man ein bisschen "Bugusing" betreiben 😃
Man kann statt einem Int64 auch einen String in qword reinschreiben und damit funktioniert es dann


[Registry]
Root: "HKLM64"; Subkey: "SOFTWARE\Name\{#MyAppName}"; ValueType: qword; ValueName: "TStamp"; ValueData: "{code:GetTimestamp}"; Flags: createvalueifdoesntexist

[Code]//Unix Timestamp
function GetUnixTimestamp(ATimerPtr: Int64): Int64; 
external 'time@msvcrt.dll cdecl';

function GetTimeStamp: string;
var
  value:int64;
begin
  value := GetUnixTimeStamp(0);
  Result := IntToStr(value);
end;

Was ich mich aber eher frage... Gibt es nicht auch in Inno eine Funktion für den UnixTimestamp?

Caveman Themenstarter:in
187 Beiträge seit 2009
vor 7 Jahren

Hallo Mossi,

es hat jetzt etwas gedauert, aber heute habe ich Deine Lösung endlich ausprobieren können.
Es wird ein Wert in die Registry geschrieben. Allerdings stimmt der nicht, denn es werden nochmals acht Nullen hinter dem eigentlichen Wert drangehängt.
Habe es deshalb jetzt mit Integer gemacht.
Vielen Dank jedenfalls für Deine Lösung!

Mir ist nicht bekannt, dass Inno eine eingebaute Funktion dafür hätte.