![]() |
Interface-Events aus Typbibliothek zum Laufen bringen
Hallo liebes Forum,
ich habe heute ein großes Delphi Programm vorgesetzt bekommen. Es kommuniziert mit einer .dll mit anderen Programmen. Ich habe die .dll in das Projekt eingefügt und erhalte 3 Interfaces mit verschiedenen Funktionen und Prozeduren. Ein Interface davon enthält alle Events, die auftreten können (z.B. function ScanModeChanged(NewState: WideString): Integer;) Ein weiteres Interface alle Prozeduren, die aufgerufen werden können. Da gibt es auch ein Objekt im Programm. Jetzt möchte ich im Programm bei Eintritt des Events gerne eine eigene Prozedur aufgerufen haben:
Delphi-Quellcode:
Aber wie mache ich das? Es sollte ja möglichst wie ein Event abgearbeitet werden...
procedure ScanModeChanged(NewState: WideString);
begin ... end; Ich hab mir überlegt:
Delphi-Quellcode:
Da gibt es aber Probleme, weil ja MeinEvent eine function und Event eine procedure... undso...
Events: IEvents;
... implementation OnFormCreate begin Event := Events.MeinEvent; end; Event begin end; Ich hoffe ihr versteht mein Problem und könnt mir helfen. Ich kenne mich in Delphi nicht sonderlich aus, bin eher der C#ler Grüße |
AW: Interface-Events aus Typbibliothek zum Laufen bringen
Auch mit C# würdest du für die Beantwortung der Frage mehr Informationen benötigen.
Wie wäre es, wenn du die echte Interface-Deklaration hier postest? Achja, und Pseudocode ist hier generell auch schlecht, weil es bei DLL auch um Aufrufkonventionen geht.
Delphi-Quellcode:
oder
stdcall
Delphi-Quellcode:
oder nix ist ein großer Unterschied
cdecl
|
AW: Interface-Events aus Typbibliothek zum Laufen bringen
Ich komm mit
![]() Der "bastelt" aus einer Event-Interface eine Delphi-komponente. |
AW: Interface-Events aus Typbibliothek zum Laufen bringen
Hallo,
danke für die Antworten erst einmal. ich habe die richtigen Deklarationen momentan nicht da, ich werde sie morgen reinstellen... Aus der Erinnerung sah die Deklaration ungefähr so aus:
Delphi-Quellcode:
Vielleicht hilft dir das schon erst einmal? Was macht denn eigentlich stdcall, cdecl oder nichts?
IEvents = interface (IDispatch)
function Foo (Result: WideString): HRESULT; stdcall; function Foo2 (Result: WideString): HRESULT; stdcall; ... end; |
AW: Interface-Events aus Typbibliothek zum Laufen bringen
Wenn es sich um ein Dispatch-Interface handelt, dann hast du Glück gehabt denn Delphi kann mit Bordmitteln nur auf
Delphi-Quellcode:
basierende Events verarbeiten.
IDispatch
Falls nicht siehe Beitrag #3. Beim Importieren der Typbibliothek muss man sich eine Komponente erzeugen lassen. In diese Komponente gibt es dann normale Delphi Events, die du z.B. auf einem Form oder Datenmodul benützen kannst. |
AW: Interface-Events aus Typbibliothek zum Laufen bringen
Hallo,
Delphi-Quellcode:
Ich habe versucht, mit dem EventSinkImp daraus was zu erstellen und erhalte eine veränderte S7PROSIMLib_TLB.pas und eine S7PROSIMLibEvents.pas. Die verwende ich im Programm (uses ...).
IS7ProSimEvents = interface(IUnknown)
['{********-****-****-****-************}'] function ScanFinished(ScanInfo: OleVariant): HResult; stdcall; function ConnectionError(const ControlEngine: WideString; Error: Integer): HResult; stdcall; function PLCSimStateChanged(const NewState: WideString): HResult; stdcall; function PauseStateChanged(const NewState: WideString): HResult; stdcall; function ScanModeChanged(const NewState: WideString): HResult; stdcall; end; So. Jetzt habe ich in der Events.pas:
Delphi-Quellcode:
und das Event, ebenso wie die anderen, möchte ich jetzt im Hauptprogramm haben...
//SinkEventsForwards//
TIS7ProSimEventsPLCSimStateChangedEvent = function (Sender: TObject; const NewState: WideString): HResult of object; ... TS7PROSIMLibIS7ProSimEvents = class (TS7PROSIMLibEventsBaseSink , IS7ProSimEvents ) protected function IS7ProSimEvents.PLCSimStateChanged = DoPLCSimStateChanged; ... protected //SinkInterface// DoPLCSimStateChanged(const NewState: WideString): HResult; stdcall; ... protected //SinkEventsProtected// FPLCSimStateChanged: TIS7ProSimEventsPLCSimStateChangedEvent; ... published //SinkEventsPublished// property PLCSimStateChanged: TIS7ProSimEventsPLCSimStateChangedEvent read FPLCSimStateChanged write FPLCSimStateChanged; ... implementation ... function TS7PROSIMLibIS7ProSimEvents.DoPLCSimStateChanged(const NewState: WideString): HResult; begin Result := S_OK; if not Assigned (PLCSimStateChanged) then System.Exit; Result := PLCSimStateChanged (Self, NewState); end; Ich habe so etwas probiert:
Delphi-Quellcode:
S7ProSimPLCSimStateChanged := S7PROSIMLibEvents.TIS7ProSimEventsPLCSimStateChangedEvent;
Delphi-Quellcode:
Funktioniert irgendwie nicht:
procedure TMainForm.S7ProSimPLCSimStateChanged(Sender: TObject;const NewState: WideString);
begin ... end; E2035 Nicht genügend wirkliche Parameter Was mache ich falsch? |
AW: Interface-Events aus Typbibliothek zum Laufen bringen
Liegt wohl daran, dass hier sowas erwartet wird ;)
Delphi-Quellcode:
Zur weiteren Erklärung:function (Sender: TObject; const NewState: WideString): HResult of object; Intern wird eine function als procedure verarbeitet, wobei der Result als zusätzlicher Parameter behandelt wird. Daher kommt der Fehler "Nicht genügend wirkliche Parameter" |
AW: Interface-Events aus Typbibliothek zum Laufen bringen
Ich bin in der _TLB.pas jetzt über folgendes gestolpert:
Delphi-Quellcode:
Das ist doch schon ein Event-Handler, soweit ich das jetzt in Delphi verstanden habe, oder? Da könnte man mit
TS7ProSimPLCSimStateChanged = procedure(ASender: TObject; const NewState: WideString) of object;
... TS7ProSim = class(TOleServer) private FOnPLCSimStateChanged: TS7ProSimPLCSimStateChanged; ... published property OnPLCSimStateChanged: TS7ProSimPLCSimStateChanged read FOnPLCSimStateChanged write FOnPLCSimStateChanged; ...
Delphi-Quellcode:
eigentlich schon das Event aufrufen, richtig?
if Assigned(FOnPLCSimStateChanged) then FOnPLCSimStateChanged(...);
Blöd ist nur, dass ich jetzt nicht so etwas machen kann:
Delphi-Quellcode:
E2003 Undeklarierter Bezeichner: 'OnPLCSimStateChanged'
S7ProSim.OnPLCSimStateChanged := S7ProSimPLCSimStateChanged
|
AW: Interface-Events aus Typbibliothek zum Laufen bringen
Ist denn S7ProSim überhaupt eine Instanz von TS7ProSim?
Dann sollte OnPLCSimStateChanged bekannt sein... |
AW: Interface-Events aus Typbibliothek zum Laufen bringen
Ja... Richtig... Hab statt dem T nichts gehabt... :oops:
Toll. Alle Prozeduren stürzen mit einer Exception ab (adress violation). Falls ihr eine Idee habt, ich werde sie definitiv probieren. Wenn nicht, auch nicht schlimm. Ich hab mich entschlossen, das ganze Programm einfach in C# neu zu schreiben. Kann bei uns in der Firma eh keiner so richtig Delphi/Pascal. Vielen Dank für eure Hilfe. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:21 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 by Thomas Breitkreuz