Announcement

Collapse
No announcement yet.

c++ Programmcode nach Delphi - Probleme mit Interface und Zeigern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • c++ Programmcode nach Delphi - Probleme mit Interface und Zeigern

    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:

    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;
    };
    In Delphi habe ich das so übernommen:

    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;
    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:
    Code:
    var
      RmOsd2_1 : IRmOsd2;
    :
      RmOsd2_1 := pRmOsd2Enum.Next;
    fehl.
    Code:
    var
      pRmOsd2_1 : pIRmOsd2;
    :
      pRmOsd2_1 := pRmOsd2Enum.Next;
    funktioniert. Es wird eine Adresse übergeben. Aber wie kann ich jetzt mit dem Interface arbeiten? Alles was ich Anstelle führt zu Schutzverletzungen:

    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
    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

  • #2
    Importier doch die DLL/Exe welche dieses Interface implementiert in Delphi mithilfe des dortigen Importers und lass Delphi dir den wrapper erstellen.

    Comment


    • #3
      Sorry hatte ich nicht angegeben, aber ich programmiere in Delphi7.
      Ich wüsste nicht wo da ein Importer für Visual C++ Code sein sollte.

      Comment


      • #4
        Nicht den Sourcecode sondern die Typbibliothek

        Comment

        Working...
        X