gpt4 book ai didi

C# 字符串到长指针

转载 作者:行者123 更新时间:2023-11-30 19:33:44 27 4
gpt4 key购买 nike

我正在使用 C# 中的应用程序,它需要向 C++ 应用程序发送消息。

我是进口的

[DllImport("user32.dll")]
public static extern IntPtr SendMessage(
int hWnd, // handle to destination window
uint Msg, // message
IntPtr wParam, // first message parameter
IntPtr lParam // second message parameter
);

但是现在,我的问题是我需要将字符串传递给 wParam 和 lParam。我试过不安全的代码,但似乎字符串不像其他变量那样工作。我怎样才能做到这一点?谢谢。

最佳答案

声明错误,wParam和lParam参数是IntPtr,不长。

有一个复杂的问题,因为您正在尝试发送字符串。目标窗口是否启用 Unicode 有什么关系。 SendMessage 有两个版本,SendMessageA() 和 SendMessageW()。如果程序已过时并且使用 8 位字符串而不是 UTF-16 编码字符串,则需要使用前者。

您可以使用 Spy++ 找出答案。使用查找器工具选择应用程序的窗口。在“常规”属性选项卡中,您会看到“Window proc”。如果窗口启用了 Unicode,它会显示 (Unicode)。如果您没有看到它,则必须将字符串转换为 8 位字符。

要生成您需要传递的字符串指针,您可以使用 Marshal.StringToHGlobalAnsi 或 StringToHGlobalUni(分别是 8 位和 Unicode)。但是,您可以玩个把戏让 P/Invoke 编码器为您翻译字符串。省去了调用后必须释放字符串的麻烦。对于 Ansi 版本,您可以这样声明 API 函数:

    [DllImport("user32.dll", CharSet = CharSet.Ansi, EntryPoint = "SendMessageA", ExactSpelling = true)]
private static extern IntPtr SendMessageStrings(IntPtr hWnd, int msg, string wParam, string lParam);

Unicode 版本是这样的:

    [DllImport("user32.dll", CharSet = CharSet.Unicode, EntryPoint = "SendMessageW", ExactSpelling = true)]
private static extern IntPtr SendMessageStrings(IntPtr hWnd, int msg, string wParam, string lParam);

最后一点:如果窗口属于另一个应用程序,这将无法按原样工作,您会导致它崩溃。你传递的指针值只在你自己的进程中有效,在C++进程中无效。要解决这个问题,您必须在目标进程中分配内存以使指针有效。这需要 OpenProcess 获取进程句柄,VirtualAllocEx() 在目标进程中分配足够大的内存来存储字符串,WriteProcessMemory 写入字符串。现在您可以调用 SendMessage(),使用通过 IntPtr 声明的版本作为 wParam 和 lParam 参数,传递您从 VirtualAllocEx 获得的值。接下来使用 VirtualFreeEx() 释放内存并使用 CloseHandle 进行清理。或者,如果您经常这样做,请留着内存以备下次使用。

相当多的 P/Invoke 在那里出错。更不用说安全问题,WriteProcessMemory 需要管理员权限,需要 UAC 提升。

关于C# 字符串到长指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3094463/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com