C++ unsigned char *什么意思
我有个C++的DLL要调用,但函数里面有个参数是unsignedchar*,那么在C#中应该是什么,比如C++typedefvoid(__stdcall*lpOnRece...
我有个C++的DLL要调用,但函数里面有个参数是unsigned char *,那么在C#中应该是什么,比如C++
typedef void(__stdcall *lpOnReceiveUserData)(void *, unsigned long, unsigned char *, unsigned int);
那么在C#中怎么写!
请赐教!
问题已经解决了谢谢大家的解答,主要是参数类型写错了C++的unsigned long转换错误,许多网上都说是转换成C# ulong这个类型,害得我没有怀疑这个类型,老是把unsigned char *这个类型来搞!不过还是从confuciuskg的提示把他改过来,运行一下就OK了!网上许多东西看来还是要带有怀疑的精神去看才行啊! 展开
typedef void(__stdcall *lpOnReceiveUserData)(void *, unsigned long, unsigned char *, unsigned int);
那么在C#中怎么写!
请赐教!
问题已经解决了谢谢大家的解答,主要是参数类型写错了C++的unsigned long转换错误,许多网上都说是转换成C# ulong这个类型,害得我没有怀疑这个类型,老是把unsigned char *这个类型来搞!不过还是从confuciuskg的提示把他改过来,运行一下就OK了!网上许多东西看来还是要带有怀疑的精神去看才行啊! 展开
6个回答
展开全部
C++ unsigned char *是表示无符号字符指针的意思。
细节如下:
char 前面添加unsigned表示是无符号的字符,也就是不可以存储负数;
在数据类型后面加*表示指针的意思;
指针是C和C++的一种特色数据类型,可以方便的访问内存,也可以通过指针自己控制堆的分配与使用。
扩展资料:
基本介绍
整型的每一种都分为:无符号(unsigned)和有符号(signed)两种类型(float和double总是带符号的),在除char以外的数据类型中,默认情况下声明的整型变量都是有符号的类型;char在默认情况下总是无符号的。
如果需声明无符号类型的话就需要在类型前加上unsigned,unsigned若省略后一个关键字,大多数编译器都会认为是unsigned int。
参考资料来源:百度百科-unsigned
展开全部
(1)你是想在C#中调用C++ DLL中提供的函数接口吧?假如你的DLL名字为MyLib.dll,且位于系统路径中或运行目录中,那么在C#中如此写就可以调用了:
[DllImport("MyLib.dll")]
public extern static void lpOnReceiveUserData(
Intptr buffer,
Int32 sizeBuffer,
ref Byte name,
Int32 sizeSomething);
说明3点:
a。请注意参数转换,你可能注意到了我对C++中数据类型unsigned long和unsigned int 都转换为了C#中的Int32,这个基本没有问题,在我们现在用的32位操作系统中,都是4个字节,即32位;在16位系统中,是有区别的,long 为32位,int为16位,我想现在都应该基本没有人用16位的操作系统了吧,呵呵;
b。另外形参的名字是我根据此函数接口的意思加上的,也许名字命名得不太准确,但这并不影响正确使用,没有办法,原型中没有形参的名字(对于这个问题,稍后给你解释。顺便说一句:如果是故作高深其实很肤浅,当然也许DLL的作者有其特殊的原因,其意图我不可臆测 );
c。因为调用的是__stdcall函数,所以使用了P/Invoke的调用方法。其中的方法FunctionName必须声明为静态外部函数,即加上 extern static声明头。
(2)关于补充问题:
在C++中BYTE*一般写法是PBYTE(不过没有关系,反正都是正确的),其实BYTE就是unsigned char,<WinDef.h>中是这样定义BYTE的:typedef unsigned char BYTE;所以其在C#中对应参数转换为ref Byte;
给你解释一下C++ 中定义的这个函数接口:
typedef void(__stdcall *lpOnReceiveUserData)(void *, unsigned long, unsigned char *, unsigned int);
返回值为void,即无返回值;
__stdcall为函数的调用规范,Windows中的WINAPI宏就是被定义为__stdcall的(<WinDef.h>有这样的宏定义:#define WINAPI __stdcall),这个调用规范定义的函数接口是标准的windows API;
至于参数列表中只有类型,而没有形参名,这是因为对编译器来说,只对形参类型敏感,而形参名字其实是别忽略的,所以写不写对编译器来说都是一样的,但是程序另一方面也是写给人看的,所以作为好习惯呢,还是要写上有意义的形参名最好!
[DllImport("MyLib.dll")]
public extern static void lpOnReceiveUserData(
Intptr buffer,
Int32 sizeBuffer,
ref Byte name,
Int32 sizeSomething);
说明3点:
a。请注意参数转换,你可能注意到了我对C++中数据类型unsigned long和unsigned int 都转换为了C#中的Int32,这个基本没有问题,在我们现在用的32位操作系统中,都是4个字节,即32位;在16位系统中,是有区别的,long 为32位,int为16位,我想现在都应该基本没有人用16位的操作系统了吧,呵呵;
b。另外形参的名字是我根据此函数接口的意思加上的,也许名字命名得不太准确,但这并不影响正确使用,没有办法,原型中没有形参的名字(对于这个问题,稍后给你解释。顺便说一句:如果是故作高深其实很肤浅,当然也许DLL的作者有其特殊的原因,其意图我不可臆测 );
c。因为调用的是__stdcall函数,所以使用了P/Invoke的调用方法。其中的方法FunctionName必须声明为静态外部函数,即加上 extern static声明头。
(2)关于补充问题:
在C++中BYTE*一般写法是PBYTE(不过没有关系,反正都是正确的),其实BYTE就是unsigned char,<WinDef.h>中是这样定义BYTE的:typedef unsigned char BYTE;所以其在C#中对应参数转换为ref Byte;
给你解释一下C++ 中定义的这个函数接口:
typedef void(__stdcall *lpOnReceiveUserData)(void *, unsigned long, unsigned char *, unsigned int);
返回值为void,即无返回值;
__stdcall为函数的调用规范,Windows中的WINAPI宏就是被定义为__stdcall的(<WinDef.h>有这样的宏定义:#define WINAPI __stdcall),这个调用规范定义的函数接口是标准的windows API;
至于参数列表中只有类型,而没有形参名,这是因为对编译器来说,只对形参类型敏感,而形参名字其实是别忽略的,所以写不写对编译器来说都是一样的,但是程序另一方面也是写给人看的,所以作为好习惯呢,还是要写上有意义的形参名最好!
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
C++ unsigned char *是表示无符号字符指针的意思。
细节如下:
char 前面添加unsigned 表示是无符号的字符,也就是不可以存储负数;
在数据类型后面加*表示指针的意思;
指针是C和C++的一种特色数据类型,可以方便的访问内存,也可以通过指针自己控制堆的分配与使用。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
指针在c#里面是可以直接使用的(比如BYTE *).不过在c#里面,指针算是不安全代码,所以一般都不建议使用.
unsigned char *其实就相当于byte *
即指向一位数据的指针
typedef void
(__stdcall *lpOnReceiveUserData)(void *, unsigned long, unsigned char *, unsigned int);
本句解释--
首先它是一个声明语句.
1.__stdcall是指该函数依PASCAL标准处理参数
2.*lpOnReceiveUserData指向一个函数
3.void *, unsigned long, unsigned char *, unsigned int
指参数为void *(一切位置类型指针均可如此定义),
unsigned long
无符号长整形,
unsigned char *
一位字符,
unsigned int
无符号整型
4.由于这是一个声明,所以参数的表示只需要表示其类型,而不需要标出具体形参或实参.
如void function(int,int);这样的都是可以的
5.typedef
一般typedef都是用于为一个类型取别名.
如typedef int a;(a就是int)
但是如果倒着看:先去掉typedef,就变成了int a.即去掉typedef后是一个定义体.只不过把变量名改成了类型名,其实本质并未变化.
至于修改,说实话,c#我也不是很熟.
这段代码主要要修改的应该就是使用pascal标准的问题.
可以这样弄:
加命名空间:System.Diagnostics.SymbolStore
其它地方不怎么修改,如下:
typedef void
(*lpOnReceiveUserData)(void *, unsigned long, unsigned char *, unsigned int);
我机子上没环境 ,你试一下吧!
unsigned char *其实就相当于byte *
即指向一位数据的指针
typedef void
(__stdcall *lpOnReceiveUserData)(void *, unsigned long, unsigned char *, unsigned int);
本句解释--
首先它是一个声明语句.
1.__stdcall是指该函数依PASCAL标准处理参数
2.*lpOnReceiveUserData指向一个函数
3.void *, unsigned long, unsigned char *, unsigned int
指参数为void *(一切位置类型指针均可如此定义),
unsigned long
无符号长整形,
unsigned char *
一位字符,
unsigned int
无符号整型
4.由于这是一个声明,所以参数的表示只需要表示其类型,而不需要标出具体形参或实参.
如void function(int,int);这样的都是可以的
5.typedef
一般typedef都是用于为一个类型取别名.
如typedef int a;(a就是int)
但是如果倒着看:先去掉typedef,就变成了int a.即去掉typedef后是一个定义体.只不过把变量名改成了类型名,其实本质并未变化.
至于修改,说实话,c#我也不是很熟.
这段代码主要要修改的应该就是使用pascal标准的问题.
可以这样弄:
加命名空间:System.Diagnostics.SymbolStore
其它地方不怎么修改,如下:
typedef void
(*lpOnReceiveUserData)(void *, unsigned long, unsigned char *, unsigned int);
我机子上没环境 ,你试一下吧!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
unsigned char *
是一个指向无符号字符型的指针
c#没学过,爱莫能助了·
是一个指向无符号字符型的指针
c#没学过,爱莫能助了·
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询