我有一个C++结构,如下所示:
struct unmanagedstruct
{
int flags;
union
{
int offset[6];
struct
{
float pos[3];
float q[4];
} posedesc;
} u;
};
Run Code Online (Sandbox Code Playgroud)
而我正试图在C#中将其编组为:
[StructLayout(LayoutKind.Explicit)]
public class managedstruct {
[FieldOffset(0)]
public int flags;
[FieldOffset(4), MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 6)]
public int[] offset;
[StructLayout(LayoutKind.Explicit)]
public struct posedesc {
[FieldOffset(0), MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 3)]
public float[] pos;
[FieldOffset(12), MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
public float[] q;
}
[FieldOffset(4)]
public posedesc pose;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试将数据加载到我的结构中时,只有偏移数组的前3个元素存在(数组的长度为3).我可以确认它们的值是正确的 - 但我仍然需要其他3个元素.我做错了什么吗?
我正在使用这些函数来加载结构:
private static IntPtr addOffset(IntPtr baseAddress, int byteOffset) { …Run Code Online (Sandbox Code Playgroud) 我有一个看起来像这样的线程函数:
DWORD WINAPI Thread_ProcessFile( LPVOID lpParam ) {
char *filename = (char*)lpParam;
printf( "%s\n", filename );
}
Run Code Online (Sandbox Code Playgroud)
我还有一个调用CreateThread的类,并将上述函数用于例程地址:
void CMyClass::ProcessFile( void ) {
HANDLE tHwnd = 0;
char szBuffer[128];
strcpy( szBuffer, "test_string" );
tHwnd = CreateThread( NULL, 0, Thread_ProcessFile, (LPVOID)szBuffer, 0, NULL );
if ( tHwnd == NULL )
return;
}
Run Code Online (Sandbox Code Playgroud)
问题是例程正在接收/打印垃圾字符串而不是真实的字符串(例如随机字符集,如果有的话).但是,如果我这样做:
tHwnd = CreateThread( NULL, 0, Thread_ProcessFile, (LPVOID)"test_string", 0, NULL );
Run Code Online (Sandbox Code Playgroud)
正确接收和打印字符串.如何正确构建字符串并将其传递给我的线程函数?