C++中pbyte类型在C#对应的是什么类型。
答案:3 悬赏:20 手机版
解决时间 2021-04-01 09:53
- 提问者网友:沉默的哀伤
- 2021-03-31 13:17
C++中pbyte类型在C#对应的是什么类型。
最佳答案
- 五星知识达人网友:风格不统一
- 2021-03-31 14:52
(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,中是这样定义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的(有这样的宏定义:#define WINAPI __stdcall),这个调用规范定义的函数接口是标准的windows API;
至于参数列表中只有类型,而没有形参名,这是因为对编译器来说,只对形参类型敏感,而形参名字其实是别忽略的,所以写不写对编译器来说都是一样的,但是程序另一方面也是写给人看的,所以作为好习惯呢,还是要写上有意义的形参名最好!
追问哦,多谢。。。。。。 在问一下:C++中的CHAR* 在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,
给你解释一下C++ 中定义的这个函数接口:
typedef void(__stdcall *lpOnReceiveUserData)(void *, unsigned long, unsigned char *, unsigned int);
返回值为void,即无返回值;
__stdcall为函数的调用规范,Windows中的WINAPI宏就是被定义为__stdcall的(
至于参数列表中只有类型,而没有形参名,这是因为对编译器来说,只对形参类型敏感,而形参名字其实是别忽略的,所以写不写对编译器来说都是一样的,但是程序另一方面也是写给人看的,所以作为好习惯呢,还是要写上有意义的形参名最好!
追问哦,多谢。。。。。。 在问一下:C++中的CHAR* 在C#里应该用什么类型表示?
全部回答
- 1楼网友:孤独入客枕
- 2021-03-31 17:32
对应C#的byte[]追问不能吧,我上网查了一下是System.Int16[]类型啊。刚开始我也以为是Byte[] ,但是程序运行会出错。
- 2楼网友:蓝房子
- 2021-03-31 16:29
1、这是windows程序设计里的,自己也可以自定义类似的类型,主要是用来表示无符号单字节数值。
2、例如:
typedef unsigned char BYTE;
typedef BYTE * PBYTE;
2、例如:
typedef unsigned char BYTE;
typedef BYTE * PBYTE;
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯