【发布时间】:2014-02-12 11:59:54
【问题描述】:
在我的 C# 应用程序中,我有一个 IntPtr 类型的变量 lpData(从对非托管代码的调用中接收),它指向一个字符串。
我必须用另一个值替换这个字符串。
我试过了:
int RegQueryValueExW_Hooked(
IntPtr hKey,
string lpValueName,
int lpReserved,
ref Microsoft.Win32.RegistryValueKind lpType,
IntPtr lpData,
ref int lpcbData)
{
lpData = Marshal.StringToHGlobalUni("new string");
...
}
但这似乎并不能取代实际的字符串。
有人可以为我指出正确的方向吗?
谢谢
【问题讨论】:
-
替换什么实际的字符串?您是否尝试更改注册表中的值?字符串是不可变的,因此您只能将字符串替换为新的引用。但是,对于特定的 API 调用,您可以改用
StringBuilder- 也许这对您想要做的事情有用? -
在我的情况下 StringBuilder 崩溃(请参阅stackoverflow.com/questions/21722555/…),所以我尝试使用 IntPtr 代替,它不会崩溃;但后来我不知道如何替换字符串。
-
我在这里看到你的另一篇文章:stackoverflow.com/questions/21722555/… .... 问题在于,分配缓冲区(及其大小)并提供指针的是该 API 的“调用者”。由于它不是指向指针/引用参数的指针,因此您无法将指针更改回调用者。
标签: c# interop marshalling unmanaged intptr