相关疑难解决方法(0)

将结构数组转换为IntPtr

我试图将RECT结构的数组(下面给出)转换为IntPtr,因此我可以使用PostMessage将指针发送到另一个应用程序.

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
    public int Left;
    public int Top;
    public int Right;
    public int Bottom;

    // lots of functions snipped here
}

// so we have something to send, in reality I have real data here
// also, the length of the array is not constant
RECT[] foo = new RECT[4]; 
IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(foo[0]) * 4);
Marshal.StructureToPtr(foo, ptr, true); // -- FAILS
Run Code Online (Sandbox Code Playgroud)

这在最后一行给出了ArgumentException("指定的结构必须是blittable或具有布局信息.").我需要以某种方式使用PostMessage将这个RECT数组转移到另一个应用程序,所以我真的需要一个指向这些数据的指针.

我有什么选择?

更新:这似乎工作:

 IntPtr result = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(Win32.RECT)) * foo.Length);
 IntPtr c = new …
Run Code Online (Sandbox Code Playgroud)

.net c# marshalling

11
推荐指数
1
解决办法
2万
查看次数

WinAPI,使用64位值发布/发送消息(wParam,lParam)

我编写了一个程序,它使用MFC,因此使用WinMI函数,如PostMessage.它主要只是一个Window-thread和一个network-client-thread.我创建了自己的消息,到目前为止工作正常.稍微解释一下这个程序:
我编写了一个客户端,它通过网络获取消息,对它们进行解码,然后需要将消息发送到窗口,该窗口显示消息的值.所有这些都有效 - 使用32位值.肯定是某种没有正确使用PostMessage函数,因为lParam和wParam通常是指针.但我不能只使用指针,因为我的客户端应用程序和我的Window应用程序是两个不同的线程,客户端应用程序中的值会尽快删除.(客户端需要从服务器调用循环请求)

#define DEVICE_INFO_DATETIME 70000
long long date;
date = (value->serverTimestamp);
PostMessage(getWindowHandle(), WM_NEW_DATA, date, DEVICE_INFO_DATETIME);
Run Code Online (Sandbox Code Playgroud)

事情是我得到时间戳和其他数据编码为64位.而wparam和lparam只是32位,所以它总是截断我的值.好吧我可以用64位编译它,然后使用64位值,但这与32位系统不兼容(对吗?)而不是我想要的.这种代码的解决方法是将临时64位值或64位值的数组设置为全局变量,但我不想将它们全部保存在与内存相关的单独值中.只是传递价值将是这里的最佳解决方案.

你有什么猜测我能在这做什么吗?

c windows mfc

4
推荐指数
1
解决办法
1211
查看次数

标签 统计

.net ×1

c ×1

c# ×1

marshalling ×1

mfc ×1

windows ×1