2017-05-26 104 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#。阅读这两个关键字的文档。 –

相关问题