C++ 使用';指针';和结构(C+;+;->;VB.NET)

C++ 使用';指针';和结构(C+;+;->;VB.NET),c++,vb.net,pointers,structure,C++,Vb.net,Pointers,Structure,我有一个问题,我如何调用DLL上的函数从结构中获取数据 有一个C++实例,说明它是如何在库中工作的,我想在VB.NET < /P>上使用它。 OK,这是工作C++实例: 声明: BOOL(WINAPIV*MyFun)(DWORD start1、DWORD stop1、P_RESULT pResult、PDWORD pTpNum、myCALLBACK lpFunc)=NULL; 电话: //pStruc=结果结构 //TrpNum1,TrpNum是ULONG ULONG TrpNum1=0;

我有一个问题,我如何调用DLL上的函数从结构中获取数据

有一个C++实例,说明它是如何在库中工作的,我想在VB.NET < /P>上使用它。

<强> OK,这是工作C++实例:

声明:

BOOL(WINAPIV*MyFun)(DWORD start1、DWORD stop1、P_RESULT pResult、PDWORD pTpNum、myCALLBACK lpFunc)=NULL;
电话:

//pStruc=结果结构
//TrpNum1,TrpNum是ULONG
ULONG TrpNum1=0;
MyFun(启动、停止、pStruc+TrpNum、TrpNum1和myCB);
回拨:

void\u stdcall myCB(结果*pStruc)
{
printf(“%.3f”,(双)pStruc->val1);
tpn++;
}
当然,结构:

typedef结构{
BOOL-mybool;
德沃德·瓦尔1;
德沃德·瓦尔2;
}结果,*P_结果;
这是我的VB.net代码(不工作):

Public声明自动函数MyFun Lib“\mydll.dll”(_
ByVal以UInt32开头_
ByVal站作为UInt32_
ByRef Result作为结果,ByRef pTpNum作为UInt32,ByVal lpFunc作为DlgCB)作为布尔值
公共子呼叫MyFun()
Dim Res作为新结果
尺寸TpN为UInt32
如果MyFun(100200,Res,TpN,myCB的地址),那么
SendDebug(“确定”)
其他的
SendDebug(“失败!”)
如果结束
端接头
公共委托函数DlgCB(结果为ByVal Res)为布尔值
作为布尔值的公共函数myCB(结果为ByVal Res)
调试.打印(Res.val1)
返回真值
端函数
结构:

公共结构结果
Dim mybool作为布尔值
Dim val1 As UInt32
Dim val2 As UInt32
端部结构
你们怎么了

提前谢谢

编辑:错误是:“试图读取或写入受保护的内存。这通常表示其他内存已损坏。”


我还在代码中做了一个小的“修复”。仍然不起作用。

这里有很多问题:

  • myBool是一个整数,而不是布尔值
  • Res变量几乎肯定不能是局部变量,请将其设置为字段
  • 对于TPN可能是相同的,不清楚C++代码是否存储指针
  • 对于两个,如果C++代码存储指针,则需要对对象进行钉扎。将自己封送到使用Marshal.AllocHGlobal分配的内存会更好
  • 使用AddressOf创建的委托将被垃圾回收。您需要在字段中存储引用,这样就不会发生这种情况
  • 回调应该声明参数ByRef,而不是ByVal
  • C++回调无效,您使它返回布尔值是出于某种原因。

你需要帮助才能让这一切顺利进行,这有点超出了SO所能提供的帮助。向经验丰富的团队成员寻求帮助或聘请顾问。

对“不工作”的描述并不令人满意。添加一些关于它是如何工作的信息(在此之前,将
ByVal Res As RESULT
更改为
ByRef Res As RESULT
)。我的主要问题是如何获取具有结构(RESULT)的数组变量中的数据。。我认为我需要使用名称空间封送,但我不知道在这种情况下如何做到这一点。欢迎任何帮助。谢谢你的回复。你的主要问题是你有很多问题。专注于其中一个对你没有帮助。你能用正确的代码帮我做到这一点吗?我有点绝望(我不能,你没有足够地描述C++代码,允许任何人写正确的代码。也不是代码编写服务。不能说我没有看到这一点,所以我添加了最后一段。如果你不想接受这个建议,那么我只能建议你一个一个地逐个核对列表。你会比你更接近。是昨天,祝你好运!