Einzelnen Beitrag anzeigen

termlich

Registriert seit: 19. Feb 2005
Ort: Hamburg
4 Beiträge
 
Delphi 6 Professional
 
#1

ActiveX-dlls, Interface mit call by reference Methode

  Alt 15. Sep 2014, 20:00
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
Angehängte Dateien
Dateityp: zip Beispiel-3.01.zip (74,1 KB, 2x aufgerufen)
Tilo Ermlich

Geändert von termlich (15. Sep 2014 um 20:07 Uhr)
  Mit Zitat antworten Zitat