关于c#调用c/c++的dll类型转换问题C#调用C++编写c/svb.net的DLL函数各种参数传递问题
1.
不返回值c/svb.net的参数
C++
原型:
bool
SendNewSms(char
*szTel,
char
*szMessage);
C#引用;
[DllImport(
"CdmaCard.dll",EntryPoint="SendNewSms")]
public
static
extern
bool
SendNewSms(string
phone,string
msg);
2.
带返回值(char
*)
C++原型:
BOOL
GetCardErrorMessage(char
*szErrorMessage
,
int
errorCode);
C#引用
[DllImport(
"CdmaCard.dll",EntryPoint="GetCardErrorMessage")]
public
static
extern
int
GetCardErrorMessage(StringBuilder
msg,int
errorCode);
StringBuilder
buf
=
new
StringBuilder(1024);//指定c/svb.net的Buf大小必须大于可能c/svb.net的最大长度
GetCardErrorMessage(buf,1);
3.
带返回值(其c/svb.net他类型)
C++原型:
BOOL
GetSmsSaveStation
(int
*nSmsStation);
C#引用
[DllImport(
"CdmaCard.dll",EntryPoint="GetSmsSaveStation")]
public
static
extern
bool
GetSmsSaveStation(ref
int
nStation);
4.
传递结构体指针(C++填充)
C++原型:
struct
NET_INFO_STRUCT
{
DWORD
nDurationTime;
//持续时间
double
nReceiveByte;
//接收字节
double
nSendByte;
//发送字节
};
BOOL
NetGetConnectDetail(NET_INFO_STRUCT
*lpNetInfo);
C#引用
public
struct
NET_INFO_STRUCT
{
public
uint
nDurationTime;
//持续时间
public
double
nReceiveByte;
//接收字节
public
double
nSendByte;
//发送字节
}
[DllImport(
"CdmaCard.dll",EntryPoint="NetGetConnectDetail")]
public
static
extern
int
NetGetConnectDetail(ref
NET_INFO_STRUCT
pNetInfo);
NET_INFO_STRUCT
netInfo
=
new
NET_INFO_STRUCT();
NetGetConnectDetail(ref
netInfo);
5.
传递结构体数组(C++来填充)
C++原型:
struct
UIM_BOOK_STRUCT
{
int
UimIndex;
char
szName[15];
char
szPhone[21];
};
int
ReadUimAllBook(UIM_BOOK_STRUCT
lpUimBookItem[],int
nMaxArraySize);
C#引用
[StructLayout(LayoutKind.Sequential,
CharSet
=
CharSet.Ansi)]//可以指定编码类型
public
struct
UIM_BOOK_STRUCT
{
public
int
UimIndex;
[MarshalAs(UnmanagedType.ByValTStr,
SizeConst=
15)]
public
string
szName;
[MarshalAs(UnmanagedType.ByValTStr,
【包含c/svb.net的词条】SizeConst=
21)]
public
string
szPhone;
};
[DllImport(
"CdmaCard.dll",EntryPoint="ReadUimAllBook")]
public
static
extern
int
ReadUimAllBook([Out]
UIM_BOOK_STRUCT
[]
lpUimBookItem,int
nMaxArraySize);
UIM_BOOK_STRUCT[]
p
=
new
UIM_BOOK_STRUCT[20];
int
ret
=
ReadUimAllBook(p,p.Length);
6.
注意问题
类型不一致,会导致调用失败,
(1)
long
类型,在C++中是4字节的整数,在C#中是8字节的整数;
(2)
字符串类型的设置不正确;
开机时提示加载C:/windows/system32/oljgzn63.dll失败另一个程序正在使用此文件进程无法访问可能是这个dll因为某些原因(最大的可能是因为它的病毒,被杀软删除了)丢失了 , 但其相关的注册信息却还在,导致系统开机时还加载它,却又找不到它的文件,所以报错 。
推荐阅读
- 微信电脑版开直播怎么弄,电脑微信直播怎么开播
- 什么CPU元神,元神吃cpu还是显卡
- 科幻游戏战略投资,2021科幻游戏
- 鸿蒙内测系统要更新多久,鸿蒙内测持续多久
- c语言中专门输入函数是 c语言中输入用什么表示
- python381安装教程,python38安装步骤
- flutter设置rgb颜色,flutter 导航栏背景颜色渐变
- 观看直播界面素材,直播素材怎么写
- 美式快餐如何营销,美式快餐的优点