通过反向PInvoke将字节指针传递给C#方法 过去,我已经将一个字节数组从一个C方法传递到一个非托管C++函数。我现在试图通过一个C++方法将指针从一个C++方法传递到一个无符号字符的缓冲区中,然后返回到一个使用反向调用的Cype方法,它使用回调来返回C代码。我尝试过几种不同的想法——比如为第二个参数传递Ref-Byte、Byte*和IntPtr,但它们似乎都不起作用。以下是我使用IntPtr的测试代码:

通过反向PInvoke将字节指针传递给C#方法 过去,我已经将一个字节数组从一个C方法传递到一个非托管C++函数。我现在试图通过一个C++方法将指针从一个C++方法传递到一个无符号字符的缓冲区中,然后返回到一个使用反向调用的Cype方法,它使用回调来返回C代码。我尝试过几种不同的想法——比如为第二个参数传递Ref-Byte、Byte*和IntPtr,但它们似乎都不起作用。以下是我使用IntPtr的测试代码:,c#,visual-c++,pinvoke,marshalling,argument-passing,C#,Visual C++,Pinvoke,Marshalling,Argument Passing,C#代码: namespace TestPInvoke { 班级计划 { 静态void Main(字符串[]参数) { foo f=新的foo(); f、 DispMsg(); } } 不安全公共类食物 { 公共委托无效回调(int NumBytes,IntPtr pBuf); 公共静态无效被调用方(int NumBytes,IntPtr pBuf) { System.Console.WriteLine(“NumBytes=“+NumBytes.ToString()+”,pBuf=“); 字符串

C#代码:

namespace TestPInvoke
{
班级计划
{
静态void Main(字符串[]参数)
{
foo f=新的foo();
f、 DispMsg();
}
}
不安全公共类食物
{
公共委托无效回调(int NumBytes,IntPtr pBuf);
公共静态无效被调用方(int NumBytes,IntPtr pBuf)
{
System.Console.WriteLine(“NumBytes=“+NumBytes.ToString()+”,pBuf=“);
字符串s=“”;
字节*p=(字节*)pBuf.ToPointer();
for(int-Loop=0;Loop<50;Loop++)
{
s++=p++->ToString()+“”;
}
系统控制台写入线;
}
public void DispMsg()
{
调用方(新回调(foo.callee));
}
[DllImport(@“C:\Users\Bob\Documents\Visual Studio 2008\Projects\AttackPoker1\Win32Client\TestPInvoke\bin\Debug\TestPInvokeDLLCPP.dll”,CallingConvention=CallingConvention.StdCall)]
公共静态外部无效调用方(回调调用);
}
}

C++代码:

#include <stdio.h>
#include <string.h>

typedef unsigned char Byte;

typedef void (__stdcall *callback)(const int bytesInMsg, Byte* pintBuf);

extern "C" __declspec(dllexport) void __stdcall caller(callback call)
{
   // Debug Test on how to pass a pointer to a byte buffer to a C# method.
   Byte* pBuf = new Byte[50];
   // Initialize the buffer to something.
   Byte* p = pBuf;
   for (Byte Loop = 0; Loop < 50; Loop++)
      *p = Loop;
   // Initiate the callback into the C# code.
   call(50, pBuf);
   // Delete pBuf later.
}
#包括
#包括
typedef无符号字符字节;
typedef void(uu stdcall*回调)(const int bytesInMsg,Byte*pintBuf);
外部“C”\u declspec(dllexport)void\u stdcall调用方(回调调用)
{
//关于如何将指向字节缓冲区的指针传递给C#方法的调试测试。
字节*pBuf=新字节[50];
//将缓冲区初始化为某个值。
字节*p=pBuf;
for(字节循环=0;循环<50;循环++)
*p=回路;
//启动对C代码的回调。
呼叫(50,pBuf);
//稍后删除pBuf。
}

C++代码调用C→回调CALLY方法时,ByTestNMSG参数是正确的。但是,返回的指针不指向缓冲区的开始。取消对指针的引用似乎总是指向缓冲区中的最后一个值(49或0x31),但是在内存窗口中查看它之后,之前和之后的其余字节都是垃圾

有人对如何在不编组大型数组的情况下使其工作有任何建议吗?我希望做的是把指针在C++边上创建的一个大缓冲区传递给一个C类,这样就可以有效地从那个缓冲区读取数据。

如果不能这样做,那么我必须从C++中分配内存缓冲区,将它们放入并将它们传递到C++方法中。

所有的pNoCKE都很好,工作正常。你的C++代码中有一个愚蠢的bug,你忘记了增加指针,所以你只设置数组的第一个元素。使用

   *p++ = Loop;
或者更理智的版本,它只是对数组进行索引:

   // Initialize the buffer to something.
   for (int ix = 0; ix < 50; ++ix)
       pBuf[ix] = ix;
//将缓冲区初始化为某个值。
对于(int-ix=0;ix<50;++ix)
pBuf[ix]=ix;

谢谢。有时候我是瞎子。。。现在效果很好。
   // Initialize the buffer to something.
   for (int ix = 0; ix < 50; ++ix)
       pBuf[ix] = ix;