![]() |
Re: String aus Anwendung in Dll übergeben und zurück
Hi nochmal,
SirThornberry Dein Beispiel hab ich jetzt mal ausprobiert. Funktioniert auch bis zu StrDispose dann kackt es ab und bringt eine Fehlermeldung wegen Ungültiger Zeigeroperation. Bis jetzt sieht es so aus: Im Programm:
Delphi-Quellcode:
procedure TForm1.EditKommaExit(Sender: TObject);
var Test: String; begin LabelLoeschen(self); KommaAusgang(self, (Sender as TEdit).Text, Test); // StellenPruefen(self, Sender as TEdit); end;
Delphi-Quellcode:
Und in der DLL:
procedure KommaAusgang(Woher: TForm; Eingabe: String; var Ausgabe:String);
var EditKommaAusgang: procedure(Zeichen:PChar; var Ergebnis: PChar); stdcall; LibMod: HMODULE; Rueckgabe: PChar; begin if not FileExists('mtrcnc32.dll') then begin Fehler(Woher, 'Die Datei "mtrcnc32.dll" wurde nicht gefunden!'); end; LibMod := LoadLibrary(PChar(ExtractFilePath(ParamStr(0))+'mtrcnc32.dll')); if LibMod <> 0 then begin EditKommaAusgang := GetProcAddress(LibMod, 'EditKommaAusgang'); if Assigned(EditKommaAusgang) then begin EditKommaAusgang(PChar(Eingabe), Rueckgabe); Ausgabe := Rueckgabe; ShowMessage(Ausgabe); StrDispose(Rueckgabe); //<-- Hier kackts ab! end; FreeLibrary(LibMod); end; end;
Delphi-Quellcode:
Was muß man hier noch verbessern? Bzw. was hab ich falsch gemacht? Please help me.
procedure EditKommaAusgang(Zeichen:PChar; var Ergebnis: PChar); stdcall;
var T, VKT, HKT, B: String; MP, KP: Integer; VKTL, HKTL: Boolean; begin VKTL := False; HKTL := False; T := Zeichen; if T = '.' then T := '0.0'; if T = '-' then T := '0.0'; if T = '-.' then T := '0.0'; if Pos('.', T) = 0 then T := T + '.'; MP := Pos('-', T); KP := Pos('.', T); if KP > 0 then begin VKT := Copy(T, 1, KP - 1); if MP > 0 then VKT := Copy(VKT, 2, Length(VKT) - 1); HKT := Copy(T, KP + 1, Length(T) - KP); //Vorkommatext Nullen kürzen B := Copy(VKT, 1, 1); while B = '0' do begin VKT := Copy(VKT, 2, Length(VKT) - 1); B := Copy(VKT, 1, 1); if Length(VKT) = 0 then VKTL := True; end; //Hinterkommatext Nullen kürzen B := Copy(HKT, Length(HKT), 1); while B = '0' do begin HKT := Copy(HKT, 1, Length(HKT) - 1); B := Copy(HKT, Length(HKT), 1); if Length(HKT) = 0 then HKTL := True; end; T := ''; if MP > 0 then T := '-'; T := T + VKT + '.' + HKT; end; if T = '.' then if (VKTL = True) or (HKTL = True) then T := '0.0' else T := ''; if T = '-.' then if (VKTL = True) or (HKTL = True) then T := '0.0' else T := ''; Ergebnis := StrAlloc(length(T) + 1); Move(T[1], Ergebnis^, length(T)); Ergebnis[length(T)] := #0; end; |
Re: String aus Anwendung in Dll übergeben und zurück
So hat sich erledigt,
hab nur vorher was übersehen. Könnte sich noch jemand anschauen ob das was ich programmiert habe keine Speicherlecks oder ähnliches hinterläßt? Wär mir sehr wichtig. Konstrukitve Ratschläge nehm ich gerne an und versuche sie auch umzusetzen. Hier der fertige funktionierende Code: Die procedure im Programm
Delphi-Quellcode:
Der Aufruf im Programm:
procedure KommaAusgang(Woher: TForm; Eingabe: String; var Ausgabe:String);
var EditKommaAusgang: procedure(Zeichen:PChar; var Ergebnis: PChar); stdcall; DLLMemFreigeben: procedure(AChars: PChar); stdcall; LibMod: HMODULE; Rueckgabe: PChar; begin if not FileExists('mtrcnc32.dll') then begin Fehler(Woher, 'Die Datei "mtrcnc32.dll" wurde nicht gefunden!'); end; LibMod := LoadLibrary(PChar(ExtractFilePath(ParamStr(0))+'mtrcnc32.dll')); if LibMod <> 0 then begin EditKommaAusgang := GetProcAddress(LibMod, 'EditKommaAusgang'); DLLMemFreigeben := GetProcAddress(LibMod, 'FreeDLLMem'); if Assigned(EditKommaAusgang) and Assigned(DLLMemFreigeben) then begin EditKommaAusgang(PChar(Eingabe), Rueckgabe); Ausgabe := Rueckgabe; DLLMemFreigeben(Rueckgabe); end else Ausgabe := Eingabe; FreeLibrary(LibMod); end; end;
Delphi-Quellcode:
Und das hier in der DLL:
procedure TForm1.EditKommaExit(Sender: TObject);
var Zeichen: String; begin LabelLoeschen(self); KommaAusgang(self, (Sender as TEdit).Text, Zeichen); (Sender as TEdit).Text := Zeichen; StellenPruefen(self, Sender as TEdit); end;
Delphi-Quellcode:
Danke schon mal im voraus, Arma
procedure FreeDLLMem(AChars: PChar); stdcall
begin StrDispose(AChars); end; procedure EditKommaAusgang(Zeichen:PChar; var Ergebnis: PChar); stdcall; var T, VKT, HKT, B: String; MP, KP: Integer; VKTL, HKTL: Boolean; begin VKTL := False; HKTL := False; T := Zeichen; if T = '.' then T := '0.0'; if T = '-' then T := '0.0'; if T = '-.' then T := '0.0'; if Pos('.', T) = 0 then T := T + '.'; MP := Pos('-', T); KP := Pos('.', T); if KP > 0 then begin VKT := Copy(T, 1, KP - 1); if MP > 0 then VKT := Copy(VKT, 2, Length(VKT) - 1); HKT := Copy(T, KP + 1, Length(T) - KP); //Vorkommatext Nullen kürzen B := Copy(VKT, 1, 1); while B = '0' do begin VKT := Copy(VKT, 2, Length(VKT) - 1); B := Copy(VKT, 1, 1); if Length(VKT) = 0 then VKTL := True; end; //Hinterkommatext Nullen kürzen B := Copy(HKT, Length(HKT), 1); while B = '0' do begin HKT := Copy(HKT, 1, Length(HKT) - 1); B := Copy(HKT, Length(HKT), 1); if Length(HKT) = 0 then HKTL := True; end; T := ''; if MP > 0 then T := '-'; T := T + VKT + '.' + HKT; end; if T = '.' then if (VKTL = True) or (HKTL = True) then T := '0.0' else T := ''; if T = '-.' then if (VKTL = True) or (HKTL = True) then T := '0.0' else T := ''; Ergebnis := StrAlloc(length(T) + 1); Move(T[1], Ergebnis^, length(T)); Ergebnis[length(T)] := #0; end; exports FreeDLLMem, EditKommaAusgang; |
Re: String aus Anwendung in Dll übergeben und zurück
Zitat:
|
Re: String aus Anwendung in Dll übergeben und zurück
Gibts mit WideString keine Probleme? ICh dachte man soll PChar zur Stringübergabe bei DLL's benutzen?
|
Re: String aus Anwendung in Dll übergeben und zurück
Bei mir ist noch nie ein Fehler mit WideStrings aufgetreten.
|
Re: String aus Anwendung in Dll übergeben und zurück
Braucht man diese ShareMem Unit wenn man WideStrings verwendet?
|
Re: String aus Anwendung in Dll übergeben und zurück
|
Re: String aus Anwendung in Dll übergeben und zurück
Moin!
Zitat:
MfG Muetze1 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:18 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