C# 调用非托管代码的问题 传送void* 类型参数 望高手解救!!

clamlp 2008-03-21 11:07:13
各位老兄:
这个问题已经搞得我望美人兮天一方 啊~~~~~~~~~~~~~绝望。
飞天诚信的NetRockey6Smart SDK中有这样一个函数: int DICNet_Command(DWORD dwHandle,int cmd,void* data);
完成对指定网络锁的操作
data是跟命令有关的输入/输出数据,它原来的定义是
// RUN_DATA 所需要的 data 结构是:
typedef struct
{
WORD RunID;
WORD ParaSize;
BYTE Para[1]; // 大小为 ParaSize
} DICST_Before_Run_Data;

// RUN_DATA 返回参数的时候,data 结构是:
typedef struct
{
WORD ResultSize;
BYTE Result[1]; // 大小为 ResultSize
} DICST_After_Run_Data;
我在C#里定义成
[StructLayout(LayoutKind.Sequential)]
struct DICST_Before_Run_Data
{
public UInt16 RunID;

public UInt16 ParaSize;

public byte[] Para ;

}
[StructLayout (LayoutKind.Sequential)]
struct DICST_After_Run_Data
{
public UInt16 ResultSize;

public byte[] Result ;

}

data开始是用于传入一个指向DICST_Before_Run_Data的指针 ,调用结束后它指向DICST_After_Run_Data

我试了好几种方法
[DllImport("Nr6Cli.dll", CharSet = CharSet.Unicode, SetLastError = true)]
static extern int DICNet_Command(uint handle, int cmd, [MarshalAs(UnmanagedType.LPStruct)] object pData);
//在unSafe下用指针也不行,提示无法创建指向结构体的指针

到底应该怎么处理。SOS
...全文
149 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
EdisonJuice 2010-08-24
  • 打赏
  • 举报
回复
看一下先
SAPikachu 2008-03-22
  • 打赏
  • 举报
回复
发现前面代码有点错误,修改下

[StructLayout(LayoutKind.Sequential)]
struct DICST_Before_Run_Data
{
public UInt16 RunID;

public UInt16 ParaSize;

//public byte[] Para;

}
[StructLayout(LayoutKind.Sequential)]
struct DICST_After_Run_Data
{
public UInt16 ResultSize;

//public byte[] Result;

}
[DllImport("Nr6Cli.dll", CharSet = CharSet.Unicode, SetLastError = true)]
static extern int DICNet_Command(uint handle, int cmd, [In,Out] IntPtr data);
static void Main(string[] args)
{
DICST_Before_Run_Data before;
byte[] Para;
IntPtr ptr = Marshal.AllocHGlobal(4+before.ParaSize); //分配足够内存
Marshal.StructureToPtr(before, ptr);
Marshal.Copy(Para, 0,new IntPtr( ptr.ToInt32() + 4), before.ParaSize);
DICNet_Command(0, 0, ptr);
DICST_After_Run_Data after;
Marshal.PtrToStructure(ptr, after);
byte[] result = new byte[after.ResultSize+2];
Marshal.Copy(ptr,result,0,after.ResultSize+2); //丢弃前2字节,后面就是result
Marshal.FreeHGlobal(ptr);
}
SAPikachu 2008-03-22
  • 打赏
  • 举报
回复
[StructLayout(LayoutKind.Sequential)]
struct DICST_Before_Run_Data
{
public UInt16 RunID;

public UInt16 ParaSize;

public byte[] Para;

}
[StructLayout(LayoutKind.Sequential)]
struct DICST_After_Run_Data
{
public UInt16 ResultSize;

//public byte[] Result;

}
[DllImport("Nr6Cli.dll", CharSet = CharSet.Unicode, SetLastError = true)]
static extern int DICNet_Command(uint handle, int cmd, [In,Out] IntPtr data);
static void Main(string[] args)
{
DICST_Before_Run_Data before;
IntPtr ptr = Marshal.AllocHGlobal(10); //分配足够内存
Marshal.StructureToPtr(before, ptr);
DICNet_Command(0, 0, ptr);
DICST_After_Run_Data after;
Marshal.PtrToStructure(ptr, after);
byte[] result = new byte[after.ResultSize+2];
Marshal.Copy(ptr,result,0,after.ResultSize+2); //丢弃前2字节,后面就是result
Marshal.FreeHGlobal(ptr);
}

没有调试过。。。楼主参考下吧。。。
真相重于对错 2008-03-22
  • 打赏
  • 举报
回复
[StructLayout(LayoutKind.Sequential)]
struct DICST_Before_Run_Data
{
public UInt16 RunID;

public UInt16 ParaSize;

public System.IntPtr Para ;

}
[StructLayout (LayoutKind.Sequential)]
struct DICST_After_Run_Data
{
public UInt16 ResultSize;

public System.Intptr Result ;

}
clamlp 2008-03-22
  • 打赏
  • 举报
回复
先谢过~~~~~~`
我试一下先!!
masterz 2008-03-22
  • 打赏
  • 举报
回复
何不用VC++给它做一个.NET的封装?
zhangjjhua 2008-03-21
  • 打赏
  • 举报
回复
帮顶
clamlp 2008-03-21
  • 打赏
  • 举报
回复
它的VC调用例子是这样的
BYTE byData[256];

DICST_Before_Run_Data* pBeforeRun=(DICST_Before_Run_Data*)byData;
DICST_After_Run_Data* pAfterRun=(DICST_After_Run_Data*)byData;

pBeforeRun->RunID=(WORD)dwID;
pBeforeRun->ParaSize=(WORD)dwSize;
for(DWORD i=0; i<dwSize; i++) pBeforeRun->Para[i]=(BYTE)dwData[i];

dwRet=g_DICNet6S.Command(g_dwCurHandle,RUN,byData);

if(dwRet)
{
printf("****** Run %04X failed, retCode=%08X(%u).\n",dwID,dwRet,dwRet);
}

else
{
printf("****** Return data size: %d\n",pAfterRun->ResultSize);

DumpBuf(pAfterRun->Result,pAfterRun->ResultSize);

}

7,540

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧