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.
In C# habe ich das so gelöst:
Mit Hilfe dieser Klasse kann ich eine Datenstack zusammenbauen.
Den Handle dieser Instanz übergebe ich als Parameter 3 der Funktion "NdrClientCall2(,,)".
Kann mir jemand sagen wie ich den Pointer (Ptr<T> : IDisposable) in C++ nachbilden?
Vielen Dank für die Hilfe
Grüße von CopWorker
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