2016-07-30 111 views
2


Ich möchte einen DCOM-Client/Server in Delphi 2010 schreiben, der IStrings verwendet, um Memo1.Lines (als TStrings) als Eigenschaft in einem Testserver zu übergeben. Der Server hat eine TMemo-Komponente und ich möchte seine Memo1.Lines-Eigenschaft über IMemoIntf des Servers festlegen oder abrufen.
1-In RIDL-Editor IStrings wurde nicht mit dem fertigen Delphi 2010 akzeptiert. Also habe ich zuerst stdvcl40.dll registriert und es dem "uses" -Teil des Editors hinzugefügt, um Eigenschaft vom Typ IStrings hinzufügen zu können .

2-Then implementiert ich zwei Funktions Set_Text und GET_TEXT zu setzen und die Memo1.Lines des Servers zu erhalten, wie folgt:

Wie werden IFont und IStrings in Delphi 2010 verwendet?

procedure TMemoIntf.Set_Text(const Value: IStrings); 
begin 
    SetOleStrings(Form1.GetText, Value); 
end; 


function TMemoIntf.Get_Text: IStrings; 
begin 
    GetOleStrings(Form1.GetText, Result); 
end; 

IMemoIntf ist die Schnittstelle, die von TMemoIntf umgesetzt worden ist. Es wird automatisch wie folgt definiert:

// *********************************************************************// 
// Interface: IMemoIntf 
// Flags:  (4416) Dual OleAutomation Dispatchable 
// GUID:  {2B6BD766-5FB6-413F-B8E2-4AB05D87E669} 
// *********************************************************************// 
    IMemoIntf = interface(IDispatch) 
    ['{2B6BD766-5FB6-413F-B8E2-4AB05D87E669}'] 
    function Get_Text: IStrings; safecall; 
    procedure Set_Text(const Value: IStrings); safecall; 
    property Text: IStrings read Get_Text write Set_Text; 
    end; 

Und TMemoIntf wie folgt:

TMemoIntf = class(TAutoObject, IMemoIntf) 
protected 
    function Get_Text: IStrings; safecall; 
    procedure Set_Text(const Value: IStrings); safecall; 
end; 

Wenn in Client nenne ich fMemo.Set_Text alles in Ordnung ist und ordnungsgemäß funktioniert, und der Client setzt den Server Memo1 Inhalt eine eigene, aber wenn ich fMemo.Get_Text, um den Inhalt des Servers Memo1 Inhalt zu erhalten, bekomme ich die folgende Fehlermeldung.

Access violation at address ... in module 'combase.dll'.Read of address ...

Der Kunde verfügt über ein eigenes Feld fMemo, die den Server und eine Memo1 zeigt, dass das Ergebnis der Set/GET_TEXT Anrufe anzuzeigen verwendet wird.

TForm2 = class(TForm) 
... 
    btnSetText: TButton; 
... 
    btnGetText: TButton; 
    Memo1: TMemo; 
... 
    procedure btnSetTextClick(Sender: TObject); 
... 
    procedure btnGetTextClick(Sender: TObject); 
private 
    fMemo : IMemoIntf; 
end; 

// it gives me the error 
procedure TForm2.btnGetTextClick(Sender: TObject); 
var 
    Strings : IStrings; 
begin 
    Strings := fMemo.Get_Text; 
    SetOleStrings(Memo1.Lines, Strings); 
end; 

// it works fine 
procedure TForm2.btnSetTextClick(Sender: TObject); 
var 
    Strings : IStrings; 
begin 
    GetOleStrings(Memo1.Lines, Strings); 
    fMemo.Set_Text(Strings); 
end; 

das gleiche denken an IFont bewerben, aber OLE_COLOR funktioniert einwandfrei, wenn ich dieselben Dinge umsetzen mit TFont und TColor zu arbeiten (ich weiß OLE_COLOR direkt als Automatisierungs vermarshallten Typ unterstützt, und unterscheidet sich von den beiden).

Mache ich es falsch oder ist es etwas in Delphi 2010?
Wie das Problem in Delphi 2010 mit IFont und IStrings zu mindern?

+0

Das obige Problem wurde in Windows 10-Pro 64-Bit mit "combase.dll" Fehler getestet. In Windows 7-Ultimate 32bits tritt der Fehler in "ole32.dll" auf. In diesem Test muss ich auch "stdvcl40.dll" registrieren. – Zonouzi

+0

Ok, ich habe "IStrings" durch "TStrings.Text" in Get/Set-Funktionen in einer neuen Schnittstelle ersetzt und BSTR verwendet, wie es von COM unterstützt wird. Dies ist ein Workaround und keine Minderung. Das Finden eines Grundes sollte auch für "IFont" hilfreich sein. Kennt jemand eine gute Referenz für das speziell für Delphi 2010 angepasste Marshalling? Ich bin auf der Suche nach neuen "IString" und "IFont" Ersatz. Oder durchsuchen Sie den Quellcode, um den Grund für dieses Problem zu finden. – Zonouzi

+0

Hallo David, stimmt etwas nicht mit meiner Frage oder mir? Ich habe keine Antwort oder Kommentar zu meiner Frage erhalten. Ist das normal. Oder gibt es etwas, was ich tun muss, um mehr Erfolg zu haben?Vielen Dank im Voraus. – Zonouzi

Antwort

0

Ok, ich habe gefunden, was falsch war, ich war es.

Die Definition der Datei ".ridl" ist sehr wichtig. Für die "Getter-Funktion" sollte der Parameter "out" ein "IStrings **" und für die "Putter-Funktion" "IStrings *" sein. Der Compiler aktualisiert automatisch die "TLB" -Datei und fügt der Schnittstellendefinition eine Eigenschaft hinzu, und mit der vorherigen Implementierung von "IMemoIntf" ist in beiden Richtungen alles in Ordnung.

Ich hoffe, das hilft Ihnen. Ich weiß nicht, wie ich anhängen soll, wenn mich jemand interessiert, wie man das komplette Projekt anhängt, um zu sehen, was ich getan habe.