Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Ini-Datei in DB-Feld verlegen (https://www.delphipraxis.net/181265-ini-datei-db-feld-verlegen.html)

Sir Rufo 31. Jul 2014 13:58

AW: Ini-Datei in DB-Feld verlegen
 
Zitat:

Zitat von baumina (Beitrag 1267159)
d.h. ich brauche nochmal eine Funktion in der dll, die mein Hauptprogramm erst mal nach der zu erwartenden Größe fragt?

Jein, das kann man auch mit einer Funktion machen, die als Rückgabewert die Größe rausgibt, die man dann natürlich auswertet, die Größe anpasst und die Funktion nochmal aufruft.

Oder man erfragt (bekommt) statt der Csllback-Funktion ein Interface und arbeitet mit diesem Interface in der DLL.
Zitat:

Zitat von DeddyH (Beitrag 1267160)
Nicht unbedingt eine neue Funktion, aber neue Parameter.

Der Rückgabewert reicht doch, wenn man den auch auswerten würde ;)

baumina 31. Jul 2014 14:05

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.

DeddyH 31. Jul 2014 14:15

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.

Jumpy 31. Jul 2014 14:17

AW: Ini-Datei in DB-Feld verlegen
 
Zitat:

Zitat von baumina (Beitrag 1267165)
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.

Gibt's bei euch etwa kein Kompilierverbot vor Urlaubsantritt :-D

baumina 31. Jul 2014 14:19

AW: Ini-Datei in DB-Feld verlegen
 
Zitat:

Zitat von DeddyH (Beitrag 1267168)
@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.

Ja, der Rückgabewert ist ein ErrorCode, der wird nur aus ... frag mich nicht nach Gründen ... hier nicht ausgewertet.

baumina 31. Jul 2014 14:23

AW: Ini-Datei in DB-Feld verlegen
 
Zitat:

Zitat von Jumpy (Beitrag 1267170)
Gibt's bei euch etwa kein Kompilierverbot vor Urlaubsantritt :-D

Ich bin Alleinkompilierer, aber mir gefällt die Idee, ich sollte es mir selbst auferlegen.

DeddyH 31. Jul 2014 14:25

AW: Ini-Datei in DB-Feld verlegen
 
Ohne Gewähr schnell heruntergetippelt:
Delphi-Quellcode:
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.
Und der Aufruf:
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;

baumina 31. Jul 2014 14:45

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.

DeddyH 31. Jul 2014 14:48

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.

baumina 31. Jul 2014 14:52

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 07:30 Uhr.
Seite 3 von 4     123 4      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz