![]() |
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:
Im ersten Step habe ich versucht, einen WideString per reference von einer ActiveX-dll bearbeiten zu lassen.
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; 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:
Test-Client:
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.
Delphi-Quellcode:
Danke
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. Tilo |
AW: ActiveX-dlls, Interface mit call by reference Methode
Gefunden:
Delphi-Quellcode:
Jetzt läuft's.
function TC1.alterString(var s1: WideString): HResult;
begin s1 := s1 + PAnsiChar(' DRANGEHÄNGT'); end; Aber wie kann ich jetzt z.B. eine ComboBox (s.o.) mittels ActiveX-dll traktieren? |
AW: ActiveX-dlls, Interface mit call by reference Methode
ANSI?
Delphi-Quellcode:
Sollte aber genauso funktionieren, wie ein
function TC1.alterString(var s1: WideString): HResult;
begin s1 := s1 + PWideChar(' DRANGEHÄNGT'); end;
Delphi-Quellcode:
:gruebel:
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:
|
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 |
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: ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:38 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