![]() |
DLL Problem bei IntToStr und Uppercase
servus,
habe mir eine kleine Testanwendung mit TJvInterpreterProgram gebaut. Möchte die Procedure gerne in einer DLL auslagern, so kann ich mein Script immer wieder updaten ohne das die Anwendung neu kompiliert werden muss. Allerdings kommt bei uppercase ein Fehler
Delphi-Quellcode:
Meine DLL
Type
TScriptData = procedure(st : TScriptThread; Identifier: string; var Value: Variant; Args: TJvInterpreterArgs; var Done: Boolean); stdcall;// external 'Script.dll'; //... procedure TScriptThread.Interpreter_GetValue(Sender: TObject; Identifier: string; var Value: Variant; Args: TJvInterpreterArgs; var Done: Boolean); var Dll : THandle; DllPath : String; DLLScriptData : TScriptData; begin DllPath := ExtractFilePath(ParamStr(0)) + 'script.dll'; DLL := LoadLibrary(PChar(DllPath)); try DLLScriptData := GetProcAddress(DLL, 'ScriptData'); if Assigned(DLLScriptData) then DLLScriptData(self, Identifier, Value, Args, Done); except fErrorStr := 'Fehler beim Befehl <'+sIdentifier+'>'; if Assigned(fonError) then fonError(fErrorStr, self); end; FreeLibrary(DLL); end; //<- wenn uppercase in Identifier steht kommt hier der fehler
Delphi-Quellcode:
Der Befehl Konsole funktioniert. Nur bei uppercase kommt eine Fehlermeldung.
library Script;
uses SysUtils, Classes, JvInterpreter, Tools_Scripte; Procedure ScriptData(st : TScriptThread; Identifier: string; var Value: Variant; Args: TJvInterpreterArgs; var Done: Boolean); stdcall; begin ///... Identifier := lowercase(Identifier); lCommands.Text := lowercase(lCommands.Text); done := not( lCommands.IndexOf(Identifier) = -1); if Identifier = 'uppercase' then Value := Uppercase(Args.Values[0]); //Konsole if Identifier = 'konsole' then st.OutKonsoleP(Args.Values[0]); end; exports ScriptData; begin end. Kann mir da einer weiterhelfen? Habe bestimmt irgend wo einen Fehler gemacht. mfg |
Re: DLL Problem bei IntToStr und Uppercase
Hi,
DLL und Strings aus Funktionen oder Proceduren zu ex oder importieren klappt nicht so einfach. Verwende PChar(s) oder array [0..X] of chars. Weitere Infos findest du dazu hier in der DP. |
Re: DLL Problem bei IntToStr und Uppercase
Das kommt davon, wenn man den automatisch in den DLL-Source eingefügten Kommentar nicht liest. :mrgreen:
|
Re: DLL Problem bei IntToStr und Uppercase
Sehr geehrter Herr DeddyH,
sie meinen bzw. beziehen sich auf Zitat: Zitat:
Meiner vergisst das gern, da er es sich, auf meine Person bezogen, leistet DLL als nonVCL zu verfassen. :mrgreen: |
Re: DLL Problem bei IntToStr und Uppercase
Ich weiß jetzt zwar nicht, was eine DLL mit NonVCL zu tun hat, aber wenn man auf solche Annehmlichkeiten wie ein automatisch erstelltes Codegerüst (inkl. des Kommentars *g*) verzichten will, bitte :)
|
Re: DLL Problem bei IntToStr und Uppercase
lol habe es gesehen.
Habe jetzt aus dem String ein PChar gemacht. jetzt funktioniert es. Bekommen nur beim beenden der Anwendung ein EInvalidPointer, da muss ich nochmal schauen... thx |
Re: DLL Problem bei IntToStr und Uppercase
Aus String einfach Pchar machen, geht auch nicht (immer). Was hast du genau gemacht?
Edit: Welches Codegerüst und welche VCL gibt es denn in einer DLL? Nicht einmal die DLLMain wird vorbereitet. |
Re: DLL Problem bei IntToStr und Uppercase
Delphi-Quellcode:
Procedure ScriptData(st : TScriptThread; Identifier: String; var Value: Variant; Args: TJvInterpreterArgs; var Done: Boolean); stdcall;
var lCommands : TStringlist; begin //... Procedure ScriptData(st : TScriptThread; pIdentifier: PChar; var Value: Variant; Args: TJvInterpreterArgs; var Done: Boolean); stdcall; var lCommands : TStringlist; Identifier : string; begin Identifier := String(pIdentifier); //... |
Re: DLL Problem bei IntToStr und Uppercase
das ist jetzt meine ganze dll
Delphi-Quellcode:
library Script;
uses ShareMem ,SysUtils, Classes, JvInterpreter, Tools_Scripte; Procedure ScriptData(st : TScriptThread; pIdentifier: PChar; var Value: Variant; Args: TJvInterpreterArgs; var Done: Boolean); stdcall; var lCommands : TStringlist; Identifier : string; begin Identifier := String(pIdentifier); //... Identifier := lowercase(Identifier); lCommands.Text := lowercase(lCommands.Text); done := not( lCommands.IndexOf(Identifier) = -1); if Identifier = 'sleep' then sleep(Args.values[0]); if Identifier = 'strtoint' then value := StrToInt(Args.values[0]); if Identifier = 'uppercase' then Value := Uppercase(Args.Values[0]); if Identifier = 'konsole' then st.OutKonsoleP(Args.Values[0]); end; exports ScriptData; begin end. |
Re: DLL Problem bei IntToStr und Uppercase
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz