我在非托管C++中有这么简单的结构:
struct Cam
{
char ip[16];
char login[16];
char pass[16];
char name[16];
};
Run Code Online (Sandbox Code Playgroud)
和C#编组结构:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public 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;
}
Run Code Online (Sandbox Code Playgroud)
当我通过函数将C#struct传递给C++ lib时
[DllImport("NVRLib.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void AddCameraStruct(Cam cam);
...
Cam cam = new Cam();
cam.ip = "192.168.0.232";
cam.login = "admin";
cam.pass = "admin";
cam.name = "kekekeke";
AddCameraStruct(cam);
Run Code Online (Sandbox Code Playgroud)
并在C++中打印传递的值:
__declspec(dllexport) void AddCameraStruct(Camera cam)
{
printf(cam.ip);
printf("\n");
printf(cam.login);
printf("\n");
printf(cam.name);
printf("\n");
printf(cam.pass);
strcpy(camera[CAM_NUM].ip, cam.ip);
strcpy(camera[CAM_NUM].login, cam.login);
strcpy(camera[CAM_NUM].pass, cam.pass);
strcpy(camera[CAM_NUM].name, cam.name);
CAM_NUM++;
}
Run Code Online (Sandbox Code Playgroud)
它打印:
232
<EMPTY LINE>
192.168.0.232
n
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
当我从你的评论中了解更多信息后,
改变
__declspec(dllexport) void AddCameraStruct(Camera cam)
Run Code Online (Sandbox Code Playgroud)
到
__declspec(dllexport) void AddCameraStruct(Cam cam)
Run Code Online (Sandbox Code Playgroud)