Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   ActiveX-dlls, Interface mit call by reference Methode (https://www.delphipraxis.net/181893-activex-dlls-interface-mit-call-reference-methode.html)

termlich 15. Sep 2014 20:00

ActiveX-dlls, Interface mit call by reference Methode
 
Liste der Anhänge anzeigen (Anzahl: 1)
N'Abend Community,

vielleicht könnt Ihr mir weiterhelfen. Ich erarbeite mir einen Weg, ein größeres Delphi 6 Projekt häppchenweise
auf XE5 zu portieren und beschäftige mich dabei mit ActiveX-dlls.

Häufig wiederkehrende Operationen habe ich im Alt-Code in speziellen Prozeduren gecodet, die dann per call-by-reference auf
den Objekten der Applikation werkeln (ComboBoxen, StringGrinds, etc). Diese Prozeduren möchte ich nun in ActiveX-dlls, die
ich unter XE5 entwickeln werde, shiften.

Beispiel:
Delphi-Quellcode:
procedure sel_CB(SelText: string; var CBox: TComboBox);
var
NumIndex : integer;
boolGefunden : boolean;
begin
  NumIndex:=0;
  boolGefunden:=false;
  while (not BoolGefunden) and (NumIndex <CBox.Items.Count) do begin
    if SelText = CBox.Items[NumIndex] then begin
      boolGefunden:=true;
      CBox.ItemIndex:=NumIndex
    end else Inc(NumIndex);
  end;
  if not boolGefunden then CBox.ItemIndex:=0;
end;
Im ersten Step habe ich versucht, einen WideString per reference von einer ActiveX-dll bearbeiten zu lassen.
Alles kompiliert (dll und Test-Client), aber beim Aufruf schlägt es fehl. Woran kann das liegen? Kann man überhaupt
(mit vertretbarem Aufwand) VCL-GUI-Objekte auf diese Weise von dlls bearbeiten lassen?

Test-dll mit WideString-Manipulation:
Delphi-Quellcode:
unit uC1;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
  Windows, ActiveX, Classes, ComObj, Beispiel3_TLB, StdVcl,
  Dialogs;

type
  TC1 = class(TTypedComObject, IC1)
  protected
    function showString(const s1: WideString): WideString; stdcall;
    function alterString(var s1: WideString): HResult; stdcall;
  end;

implementation

uses ComServ;

function TC1.showString(const s1: WideString): WideString;
begin
  showmessage(s1);

end;

function TC1.alterString(var s1: WideString): HResult;
begin
 s1 := s1 + ' DRANGEHÄNGT';
end;

initialization
  TTypedComObjectFactory.Create(ComServer, TC1, Class_C1,
    ciMultiInstance, tmApartment);
end.
Test-Client:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs,

  Beispiel3_TLB, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  mC1  : C1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var s1: WideString;
begin
 s1 := 'Vorgabe';
 mC1.showString('Würze');
 mC1.alterString(s1);
 showmessage(s1);
end;

Initialization
mC1 := CoC1.Create;

end.
Danke
Tilo

termlich 15. Sep 2014 21:12

AW: ActiveX-dlls, Interface mit call by reference Methode
 
Gefunden:
Delphi-Quellcode:
function TC1.alterString(var s1: WideString): HResult;
begin
 s1 := s1 + PAnsiChar(' DRANGEHÄNGT');
end;
Jetzt läuft's.

Aber wie kann ich jetzt z.B. eine ComboBox (s.o.) mittels ActiveX-dll traktieren?

himitsu 15. Sep 2014 21:26

AW: ActiveX-dlls, Interface mit call by reference Methode
 
ANSI?

Delphi-Quellcode:
function TC1.alterString(var s1: WideString): HResult;
begin
  s1 := s1 + PWideChar(' DRANGEHÄNGT');
end;
Sollte aber genauso funktionieren, wie ein
Delphi-Quellcode:
function TC1.alterString(var s1: WideString): HResult;
begin
  s1 := s1 + ' DRANGEHÄNGT';
end;
:gruebel:



Klassen über Modulgrenzen?
NEIN!!!

Nur wenn man seine EXE/DLL gegen die nötigen Packages linkt.
Und dann müssen Beide mit der selben Delphi-Verison kompiliert werden, womit sich das mit dem ActiveX irgendwie sinnlos gestaltet.

Du kannst das Windows-Handle der ComboBox übergeben und in der ActiveX-DLL via WinAPI direkt damit arbeiten.


Zitat:

Delphi-Quellcode:
procedure sel_CB(SelText: string; var CBox: TComboBox);

Und wieso war/ist das eigentlich VAR?

termlich 15. Sep 2014 22:16

AW: ActiveX-dlls, Interface mit call by reference Methode
 
Hi Himitsu,

klasse! Vielen Dank. Du hast Recht, var wird nicht benötigt
(das sind ziemlich alte Code-Brocken, ich hatte sie lange nicht
mehr gesichtet).

Kannst Du mir zu dem Handle-Ansatz ein paar Codezeilen pasten... (den Transfer bekomme ich dann hin).

Viele Grüße
Tilo

himitsu 15. Sep 2014 23:33

AW: ActiveX-dlls, Interface mit call by reference Methode
 
Über CBox.Handle kommt man an das HWND und damit ans interne Windows-Control
und dann schaut man ins MSDN und schon hat man die zugehörige Dokumentateion der entsprechenden WinAPI. :roll:
http://msdn.microsoft.com/en-us/libr.../bb775792.aspx


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:01 Uhr.

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