2017-05-26 51 views
0

我在我的C++函數中有以下結構。如何將結構傳遞給C++函數並返回相同的修改?

struct Cam 
{ 
    char ip[16]; 
    char login[16]; 
    char pass[16]; 
    char name[16]; 
}; 

以下是我從CPP暴​​露講座

extern "C" __declspec(dllexport) Cam* AddCameraStruct1(Cam cam) 
{ 
//modify the cam object 
} 

的方法這裏是我如何定義在C#中的結構和功能。

[StructLayout(LayoutKind.Sequential)] 
    internal unsafe struct Cam 
    { 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] 
     public string ip; 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] 
     public string login; 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] 
     public string pass; 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] 
     public string name; 
    } 

[DllImport(@"mydll.dll", CallingConvention = CallingConvention.Cdecl)] 
    [return: MarshalAs(UnmanagedType.LPStruct)] 
    internal static extern IntPtr AddCameraStruct1(DPAPI.Cam*); 

我沒有得到如何在c#中使用此功能。請建議是否有問題。

unsafe 
{ 
       DPAPI.Cam cam = new DPAPI.Cam(); 
       cam.ip = "192.168.0.232"; 
       cam.login = "admin"; 
       cam.pass = "admin"; 
       cam.name = "kekekeke"; 
       DPAPI.Cam* cam1 = (DPAPI.Cam*)DPAPI.AddCameraStruct1(cam); 
} 

我收到以下錯誤 -

指針和固定大小緩衝區只能在不安全的上下文中使用

無法獲取的地址,獲取的大小,或聲明指針一個被管理的類型

+0

你的問題不清楚。這是什麼意思:「我沒有得到如何在C#中使用這個」?你會得到什麼錯誤? – nakiya

+0

請看我更新的問題。 –

回答

2

你不能像你那樣從函數返回結構體,你可以簡單地通過引用傳遞結構體(這是整個Windows API是如何定義的)。

這裏是如何聲明結構,別忘了註明的字符集是ANSI:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
internal struct Cam 
{ 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] 
    public string ip; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] 
    public string login; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] 
    public string pass; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] 
    public string name; 
} 

這裏是如何聲明方法(裁判爭論就像使用*):

[DllImport(@"mydll.dll", CallingConvention = CallingConvention.Cdecl)] 
internal static extern void AddCameraStruct1(ref Cam pcam); 

這裏是如何申報在C/C++:

extern "C" __declspec(dllexport) void AddCameraStruct1(Cam *pcam) 
{ 
    strcpy_s(pcam->name, "hello"); // for example 
} 

這裏是你會怎麼稱呼它沒有w:

var cam = new Cam(); 
cam.ip = "192.168.0.232"; 
cam.login = "admin"; 
cam.pass = "admin"; 
cam.name = "kekekeke"; 
AddCameraStruct1(ref cam); 
// cam.name is now "hello" 

請注意,您不需要在代碼中使用unsafe關鍵字。

+0

我嘗試了以上與關鍵字它工作fine.Any什麼時候使用而不是ref的規則? –

+0

如果我需要修改調用以將結構數組發送到本地代碼,該怎麼辦?我知道這可以通過將IntPtr傳遞給數組來完成。並不確定如何去做。 –

+2

使用ref是你傳遞數據和傳遞數據。這是它在你的問題中的樣子。儘管這是基本的C#。閱讀這兩個關鍵字的文檔。 –

相關問題