NdrClientCall2 Parameter 3 erstellen

CopWorker

Erfahrenes Mitglied
Hallo zusammen,

in mein C++ Projekt habe ich die Funktion "NdrClientCall2(,,)" eingebunden.
Jetzt weiß ich nicht wie ich den Parameter 3 zusammenstellen soll.
Diese Funktion bereitet mir der MIDL - Compiler vor.
In dem "IDL_handle" sollte das Handle vom Client-Interface und das Handle auf die zu
übertragende Datenpakete enthalten sein.

C++:
void RpcClientWriteStub( /* [size_is][ref][in] */ unsigned char pCmdBuffer[  ])
{
    handle_t IDL_handle;
    
    NdrClientCall2(
                  ( PMIDL_STUB_DESC  )&RpcClientWrite_StubDesc,
                  (PFORMAT_STRING) &RpcClientWrite__MIDL_ProcFormatString.Format[0],
                  /*( unsigned char * )&IDL_handle);*/
    
}


In C# habe ich das so gelöst:

C#:
using System;
using System.Runtime.InteropServices;

namespace CSharpTest
{
  internal class Ptr<T> : IDisposable
  {
    private readonly GCHandle _handle;
    public Ptr(T data) => this._handle = GCHandle.Alloc((object) data, GCHandleType.Pinned);
    public T Data => (T) this._handle.Target;
    public IntPtr Handle => this._handle.AddrOfPinnedObject();
    public void Dispose() => this._handle.Free();
  }
}

Mit Hilfe dieser Klasse kann ich eine Datenstack zusammenbauen.
Den Handle dieser Instanz übergebe ich als Parameter 3 der Funktion "NdrClientCall2(,,)".

C#:
private static byte[] InvokeRpc(RpcHandle handle, Guid iid, int iCmd, int iLen, byte[] input)
    
using (Ptr<byte[]> ptr2 = new Ptr<byte[]>(input))
{
    using (Ptr<int[]> ptr3 = new Ptr<int[]>(new int[10]))
    {
        ptr3.Data[0] = handle.Handle.ToInt32();
        ptr3.Data[1] = input.Length;
        ptr3.Data[2] = ptr2.Handle.ToInt32();
        ptr3.Data[3] = ptr3.Handle.ToInt32() + 24;
        ptr3.Data[4] = ptr3.Handle.ToInt32() + 32;
        
        num = RpcClientApi.NdrClientCall2x86(ptr1.Handle, RpcApi.FUNC_FORMAT_PTR.Handle, ptr3.Handle);
}

Kann mir jemand sagen wie ich den Pointer (Ptr<T> : IDisposable) in C++ nachbilden?

Vielen Dank für die Hilfe
Grüße von CopWorker
 
Zurück