Hallo,
ich versuche ein C++ Programm, das COM-Obejete verwendet nach Delphi zu übernehmen. dabei stehe ich vermutlich mit Zeigern bzw.Adressen auf Kriegsfuß.
Das C++ Programm benutzt folgende Schnittstellen:
In Delphi habe ich das so übernommen:
Was ich hier nicht verstehe - Ist das richtig in der Funktion Next einen Zeiger zu vewenden? Das Interface ist doch schon ein Zeiger. Aber wenn ich
function Next : IRmOsd2; stdcall;
verwende schlägt der Aufruf:
fehl.
funktioniert. Es wird eine Adresse übergeben. Aber wie kann ich jetzt mit dem Interface arbeiten? Alles was ich Anstelle führt zu Schutzverletzungen:
Muss ich noch selber irgendwo Speicher reservieren oder ist da schon ein grundlegender Fehler in der Übersetzung der Schnittstellen?
Vielen Dank für eure Hilfe! Als Zwischenlösung habe ich das ganze in eine C++ DLL gepackt. Funktioniert - ist aber doch eigentlich unnötig
ich versuche ein C++ Programm, das COM-Obejete verwendet nach Delphi zu übernehmen. dabei stehe ich vermutlich mit Zeigern bzw.Adressen auf Kriegsfuß.
Das C++ Programm benutzt folgende Schnittstellen:
Code:
// RmOsd2 server, enumerator and application interfaces // {8A29C1E7-EDA5-432d-B754-5E6C10E2A542} DEFINE_GUID(CLSID_RMOSD2, 0x8a29c1e7, 0xeda5, 0x432d, 0xb7, 0x54, 0x5e, 0x6c, 0x10, 0xe2, 0xa5, 0x42); // {84B0A5BF-18CF-4b8e-9271-6D39B1F50A46} DEFINE_GUID(IID_IRmOsd2Enum, 0x84b0a5bf, 0x18cf, 0x4b8e, 0x92, 0x71, 0x6d, 0x39, 0xb1, 0xf5, 0xa, 0x46); // {9993B072-3C05-48fa-BFF7-55F078D9E92B} DEFINE_GUID(IID_IRmOsd2, 0x9993b072, 0x3c05, 0x48fa, 0xbf, 0xf7, 0x55, 0xf0, 0x78, 0xd9, 0xe9, 0x2b); ///////////////////////////////////////////////////////////////////////////////////////// // // interface IRmOsd2 // ///////////////////////////////////////////////////////////////////////////////////////// struct IRmOsd2 : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE AllocateSurface(ULONG Size, PUCHAR * pBuffer) = 0; virtual HRESULT STDMETHODCALLTYPE ReleaseSurface() = 0; virtual HRESULT STDMETHODCALLTYPE SetEnable(BOOL bEnable) = 0; virtual HRESULT STDMETHODCALLTYPE SetHLI(RECT recDest) = 0; virtual HRESULT STDMETHODCALLTYPE Update(RECT recDest) = 0; virtual CHAR* STDMETHODCALLTYPE GetId() = 0; }; ///////////////////////////////////////////////////////////////////////////////////////// // // interface IRmOsd2Enum // ///////////////////////////////////////////////////////////////////////////////////////// struct IRmOsd2Enum : public IUnknown { public: virtual void STDMETHODCALLTYPE Reset() = 0; virtual IRmOsd2 * STDMETHODCALLTYPE Next() = 0; };
Code:
CLSID_RMOSD2 : TGUID = '{8A29C1E7-EDA5-432d-B754-5E6C10E2A542}'; IID_IRmOsd2Enum : TGUID = '{84B0A5BF-18CF-4b8e-9271-6D39B1F50A46}'; IID_IRmOsd2 : TGUID = '{9993B072-3C05-48fa-BFF7-55F078D9E92B}'; ///////////////////////////////////////////////////////////////////////////////////////// // // interface IRmOsd2 // ///////////////////////////////////////////////////////////////////////////////////////// type IRmOsd2 = interface(IUnknown) function AllocateSurface(Size : ULONG; var pBuffer : PUCHAR) : HRESULT; stdcall; function ReleaseSurface : HRESULT; stdcall; function SetEnable(bEnable : BOOl) : HRESULT; stdcall; function SetHLI(recDest : TRECT) : HRESULT; stdcall; function Update(recDest : TRECT) : HRESULT; stdcall; function GetId : PChar; stdcall; end; ///////////////////////////////////////////////////////////////////////////////////////// // // interface IRmOsd2Enum // ///////////////////////////////////////////////////////////////////////////////////////// Type pIRmOsd2 = ^IRmOsd2; IRmOsd2Enum = interface(IUnknown) procedure Reset; stdcall; function Next : pIRmOsd2; stdcall; end;
function Next : IRmOsd2; stdcall;
verwende schlägt der Aufruf:
Code:
var RmOsd2_1 : IRmOsd2; : RmOsd2_1 := pRmOsd2Enum.Next;
Code:
var pRmOsd2_1 : pIRmOsd2; : pRmOsd2_1 := pRmOsd2Enum.Next;
Code:
Memo1.Lines.Add('nOSD 1:' + String(pRmOsd2_1.GetId)); //Schutzverletzung Memo1.Lines.Add('nOSD 1:' + String(pRmOsd2_1^.GetId)); //Schutzverletzung var pBuffer1 : PUCHAR; : : hr := pRmOsd2_1.AllocateSurface(dwFileSize1, pBuffer1); // Schutzverletzung - dwFileSize1 OK
Vielen Dank für eure Hilfe! Als Zwischenlösung habe ich das ganze in eine C++ DLL gepackt. Funktioniert - ist aber doch eigentlich unnötig
Comment