AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign ActiveX-dlls, Interface mit call by reference Methode

ActiveX-dlls, Interface mit call by reference Methode

Offene Frage von "himitsu"
Ein Thema von termlich · begonnen am 15. Sep 2014 · letzter Beitrag vom 16. Sep 2014
Antwort Antwort
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, 21: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 21:07 Uhr)
  Mit Zitat antworten Zitat
termlich

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

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

  Alt 15. Sep 2014, 22:12
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?
Tilo Ermlich
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.131 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 15. Sep 2014, 22:26
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;




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:
procedure sel_CB(SelText: string; var CBox: TComboBox);
Und wieso war/ist das eigentlich VAR?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.

Geändert von himitsu (15. Sep 2014 um 22:31 Uhr)
  Mit Zitat antworten Zitat
termlich

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

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

  Alt 15. Sep 2014, 23:16
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
Tilo Ermlich
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.131 Beiträge
 
Delphi 12 Athens
 
#5

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

  Alt 16. Sep 2014, 00:33
Ü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.
http://msdn.microsoft.com/en-us/libr.../bb775792.aspx
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.

Geändert von himitsu (16. Sep 2014 um 01:04 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:43 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