C#下string转换成char*再给DLL作参数

wangzhihongji 2015-03-28 08:20:02
如题。。。。。

之前的那个帖子结了。。。




怎么把这里的char[]变成char*
...全文
179 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjq 2015-03-29
  • 打赏
  • 举报
回复
如果是后者,首先用System.Text.Encoding.ASCII.GetBytes把你的char[]转为byte[], 然后用Marshal.AllocHGlobal申请byte[]同样大小的非托管内存块 接着用Marshal.Copy把你的托管byte[]拷贝到刚申请的IntPtr指向的非托管内存块。 这个IntPtr就是和C/C++等价的char*了。 最后记得用Marshal.FreeHGlobal释放你创建的非托管内存块。 声明为byte*或者IntPtr,不要用char*,.NET的托管char和C/C++的char是不一样的。前者是unicode的字符,后者是单个字节byte的别名
本拉灯 2015-03-28
  • 打赏
  • 举报
回复
给你一个参考,这是我以前写加密狗时用的 这是C++的 // 4. 生成用户 ID EXTERN_C int WINAPI RY2_GenUID(int handle, DWORD* uid, char* seed, int isProtect); // 输入: // handle 设备的句柄,跟 RY2_Open 命令返回的 handle 一致。 // uid 输出参数,生成的用户 ID 从此参数返回 // seed 用户给出的用于生成用户 ID 的种子,这是一个最大长度可以是 64 个字节的字符串 // isProtect 用来指定此 Rockey2 是否可写,0 是可写,1 是不可写 #define ROCKEY2_DISABLE_WRITE_PROTECT 0 #define ROCKEY2_ENSABLE_WRITE_PROTECT 1 // 返回: // 返回的是一个错误编码,具体含义请看下面的错误编码部分。 // ==================================================================== // 5. 读取加密锁内容 EXTERN_C int WINAPI RY2_Read(int handle, int block_index, char* buffer512); // 输入: // handle 设备的句柄,跟 RY2_Open 命令返回的 handle 一致。 // block_index 块索引,指明要读取的是哪1个块,取值为(0-4) // buffer512 读出块的缓冲区,因为每个块的长度固定为 512 个字节,所以这个 // buffer 的大小至少是 512 个字节 // 返回: // 返回的是一个错误编码,具体含义请看下面的错误编码部分。 // ==================================================================== // 6. 写入加密锁内容 EXTERN_C int WINAPI RY2_Write(int handle, int block_index, char* buffer512); 这是C#定义的 // 5. 读取加密锁内容 [DllImport("Rockey2.dll", EntryPoint = "RY2_Read", SetLastError = true)] public static extern int Read(int handle, int block_index, StringBuilder buffer512); // 输入: // handle 设备的句柄,跟 RY2_Open 命令返回的 handle 一致。 // block_index 块索引,指明要读取的是哪1个块,取值为(0-4) // buffer512 读出块的缓冲区,因为每个块的长度固定为 512 个字节,所以这个 // buffer 的大小至少是 512 个字节 // 返回: // 返回的是一个错误编码,具体含义请看下面的错误编码部分。 // 6. 写入加密锁内容 [DllImport("Rockey2.dll", EntryPoint = "RY2_Write")] public static extern int Write(int handle, int block_index, string buffer512);
本拉灯 2015-03-28
  • 打赏
  • 举报
回复
楼主呀,你试过用string没? C++里如果用char* 那C#里就能用string或StringBuider来表示他的参数。
Regan-lin 2015-03-28
  • 打赏
  • 举报
回复
你这样*xxx是搞什么,你不用char[]来接受,你用*xxx来干什么的
  • 打赏
  • 举报
回复
不用再发了,会有人来回复你的,不过今天是周六,估计要周一才有人来回复你
wangzhihongji 2015-03-28
  • 打赏
  • 举报
回复
如果你想对取地址符号的话,它会提示你无法获取托管类型的地址。。。

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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