![]() |
AW: Ini-Datei in DB-Feld verlegen
Zitat:
Oder man erfragt (bekommt) statt der Csllback-Funktion ein Interface und arbeitet mit diesem Interface in der DLL. Zitat:
|
AW: Ini-Datei in DB-Feld verlegen
Mein Problem ist, dass ich nicht alle DLLs gleichzeitig umstellen mag, das sind mir zu viele, zudem einige noch Delphi 2007 sind und noch nicht mit Delphi XE getestet wurden. Deswegen wollt ich vermeiden, dass ich in meinem Hauptprogramm an der Stelle was ändere.
Ich denke das hat so auf die Schnelle alles keinen Zweck (ich hab nur noch 6 Stunden Arbeitszeit), in meinem Hirn dreht sich alles, da kann nur Mist dabei rauskommen. Schieb ich mal auf nach meinen Urlaub, dann hab ich auch wieder mehr Nerv. EDIT: @Sir Rufo Mir scheint ich sollte mich mal mit Interfaces beschäftigen, da du so begeistert nahezu alles damit löst. |
AW: Ini-Datei in DB-Feld verlegen
@Sir Rufo: sie hat nunmal mehrere Strings, aber nur einen Rückgabewert. Da sollte dieser IMO lieber einen ErrorCode zurückgaben statt einer Längenangabe.
|
AW: Ini-Datei in DB-Feld verlegen
Zitat:
|
AW: Ini-Datei in DB-Feld verlegen
Zitat:
|
AW: Ini-Datei in DB-Feld verlegen
Zitat:
|
AW: Ini-Datei in DB-Feld verlegen
Ohne Gewähr schnell heruntergetippelt:
Delphi-Quellcode:
Und der Aufruf:
library BufferDLL;
{ Wichtiger Hinweis zur DLL-Speicherverwaltung: ShareMem muss die erste Unit in der USES-Klausel Ihrer Bibliothek UND in der USES-Klausel Ihres Projekts (wählen Sie 'Projekt-Quelltext anzeigen') sein, wenn Ihre DLL Prozeduren oder Funktionen exportiert, die Strings als Parameter oder Funktionsergebnisse übergeben. Dies gilt für alle Strings, die an oder von Ihrer DLL übergeben werden, auch für solche, die in Records und Klassen verschachtelt sind. ShareMem ist die Interface-Unit zur gemeinsamen BORLNDMM.DLL-Speicherverwaltung, die zusammen mit Ihrer DLL weitergegeben werden muss. Übergeben Sie String-Informationen mit PChar- oder ShortString-Parametern, um die Verwendung von BORLNDMM.DLL zu vermeiden. } uses Windows, SysUtils; {$R *.res} function SomeTest(Param1: PAnsiChar; var Param1Len: integer; Param2: PAnsiChar; var Param2Len: integer): integer; stdcall; const Result1 = 'Hallo Welt'; Result2 = 'Wuppdi'; begin Result := 0; if Param1Len < Length(Result1) then begin Param1Len := Length(Result1); Result := ERROR_INSUFFICIENT_BUFFER; end; if Param2Len < Length(Result2) then begin Param2Len := Length(Result2); Result := ERROR_INSUFFICIENT_BUFFER; end; if Result = 0 then begin StrPCopy(Param1, Result1); StrPCopy(Param2, Result2); end; end; exports SomeTest; begin end.
Delphi-Quellcode:
function SomeTest(Param1: PAnsiChar; var Param1Len: integer; Param2: PAnsiChar;
var Param2Len: integer): integer; stdcall; external 'BufferDLL.dll'; procedure TFormTest.ButtonTestClick(Sender: TObject); var s1, s2: Ansistring; Len1, Len2: integer; begin Len1 := 0; Len2 := 0; s1 := ''; s2 := ''; if SomeTest(nil, Len1, nil, Len2) = ERROR_INSUFFICIENT_BUFFER then begin SetLength(s1, Len1); SetLength(s2, Len2); if SomeTest(PAnsiChar(s1), Len1, PAnsiChar(s2), Len2) = 0 then ShowMessage(Format('%s%s%s', [s1, sLineBreak, s2])); end; end; |
AW: Ini-Datei in DB-Feld verlegen
Hm, in einem Rutsch geht das dann ja wohl auch nicht oder? Du rufst ja SomeTest zweimal auf.
|
AW: Ini-Datei in DB-Feld verlegen
Ja natürlich, erst ermittle ich die benötigten Stringlängen und dann erst die Strings. Das ist aber nicht unüblich.
|
AW: Ini-Datei in DB-Feld verlegen
Wenn ich mein Array nun einfach auf 10000 mache, was mir sicher gut reichen wird, schreien dann alle mit "Oh Gott, oh Gott, bist du wahnsinnig ...." auf?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03: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