C#呼叫C++編寫的DLL函式引數傳遞
阿新 • • 發佈:2018-11-05
1. 不返回值的引數
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);
//指定的Buf大小必須大於可能的最大長度
-
GetCardErrorMessage(buf,
1);
3. 帶返回值(其他型別)
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, 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) 字串型別的設定不正確;
以下是幾個簡單的window呼叫
-
[
System.Security.SuppressUnmanagedCodeSecurity]
// We won't use this maliciously
-
[
DllImport("User32.dll", CharSet=CharSet.Auto)]
-
public static extern bool ScreenToClient(IntPtr hWnd, ref System.Drawing.Point rect);
-
-
[
System.Security.SuppressUnmanagedCodeSecurity]
// We won't use this maliciously
-
[
DllImport("User32.dll", CharSet=CharSet.Auto)]
-
public static extern bool GetWindowRect(IntPtr hWnd, out System.Drawing.Rectangle rect);
-
-
[
System.Security.SuppressUnmanagedCodeSecurity]
// We won't use this maliciously
-
[
DllImport("User32.dll", CharSet=CharSet.Auto)]
-
public static extern bool UnregisterClass([MarshalAs(UnmanagedType.LPTStr)] string className, IntPtr instanceHandle);
轉自 http://blog.csdn.net/wen158809179/article/details/5704701
1. 不返回值的引數
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);
//指定的Buf大小必須大於可能的最大長度
-
GetCardErrorMessage(buf,
1);
3. 帶返回值(其他型別)
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, 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) 字串型別的設定不正確;
以下是幾個簡單的window呼叫
-
[
System.Security.SuppressUnmanagedCodeSecurity]
// We won't use this maliciously
-
[
DllImport("User32.dll", CharSet=CharSet.Auto)]
-
public static extern bool ScreenToClient(IntPtr hWnd, ref System.Drawing.Point rect);
-
-
[
System.Security.SuppressUnmanagedCodeSecurity]
// We won't use this maliciously
-
[
DllImport("User32.dll", CharSet=CharSet.Auto)]
-
public static extern bool GetWindowRect(IntPtr hWnd, out System.Drawing.Rectangle rect);
-
-
[
System.Security.SuppressUnmanagedCodeSecurity]
// We won't use this maliciously
-
[
DllImport("User32.dll", CharSet=CharSet.Auto)]
-
public static extern bool UnregisterClass([MarshalAs(UnmanagedType.LPTStr)] string className, IntPtr instanceHandle);
轉自 http://blog.csdn.net/wen158809179/article/details/5704701