Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi DLL Problem bei IntToStr und Uppercase (https://www.delphipraxis.net/128280-dll-problem-bei-inttostr-und-uppercase.html)

Jackie1983 27. Jan 2009 12:08


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:
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
Meine DLL
Delphi-Quellcode:
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.
Der Befehl Konsole funktioniert. Nur bei uppercase kommt eine Fehlermeldung.
Kann mir da einer weiterhelfen? Habe bestimmt irgend wo einen Fehler gemacht.

mfg

turboPASCAL 27. Jan 2009 12:12

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.

DeddyH 27. Jan 2009 12:15

Re: DLL Problem bei IntToStr und Uppercase
 
Das kommt davon, wenn man den automatisch in den DLL-Source eingefügten Kommentar nicht liest. :mrgreen:

turboPASCAL 27. Jan 2009 12:26

Re: DLL Problem bei IntToStr und Uppercase
 
Sehr geehrter Herr DeddyH,
sie meinen bzw. beziehen sich auf Zitat:

Zitat:

Hinweis zur DLL-Speicherverwaltung: ShareMem muß sich in der
ersten Unit der unit-Klausel der Bibliothek und des Projekts befinden ...
So oder Ähnlich.

Meiner vergisst das gern, da er es sich, auf meine Person bezogen, leistet DLL als nonVCL zu verfassen. :mrgreen:

DeddyH 27. Jan 2009 12:32

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 :)

Jackie1983 27. Jan 2009 13:09

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

sirius 27. Jan 2009 13:14

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.

Jackie1983 27. Jan 2009 13:16

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);
//...

Jackie1983 27. Jan 2009 13:19

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.

Luckie 27. Jan 2009 13:28

Re: DLL Problem bei IntToStr und Uppercase
 
Zitat:

Zitat von Jackie1983
das ist jetzt meine ganze dll

Und?


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:20 Uhr.
Seite 1 von 2  1 2      

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