c语言 getwindowtext()获取到的字符数组不正确,对于C#,在调用Win32函数(如GetWindowText)时,是否存在使用'string'而不是'StringBuilder'的缺点?...

考虑这两个定义GetWindowText.一个使用a string作为缓冲区,另一个使用a StringBuilder代替:

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]

public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]

public static extern int GetWindowText(IntPtr hWnd, string lpString, int nMaxCount);

这是你怎么称呼他们:

var windowTextLength = GetWindowTextLength(hWnd);

// You can use either of these as they both work

var buffer = new string('\0', windowTextLength);

//var buffer = new StringBuilder(windowTextLength);

// Add 1 to windowTextLength for the trailing null character

var readSize = GetWindowText(hWnd, buffer, windowTextLength + 1);

Console.WriteLine($"The title is '{buffer}'");

无论我是通过a string还是a,它们似乎都能正常工作StringBuilder.但是,我见过的所有例子都使用了StringBuilder变体.甚至PInvoke.net也列出了那个.

我的猜测是"在C#字符串是不可变的,因此使用StringBuilder",但是因为我们正在寻找Win32 API并直接搞乱内存位置,并且该内存缓冲区用于所有意图和目的(预分配) (即保留用于字符串并且当前由字符串使用)由于其定义的值被赋予了一个值,该限制实际上并不适用,因此string工作得很好.但我想知道这个假设是否错误.

我不这么认为,因为如果你通过增加缓冲区来测试这个10,并改变你正在用'A'初始化它的字符,那么将更大的缓冲区大小传递给GetWindowText,你得到的字符串是实际的标题,右边填充了10个额外的"未被覆盖的A",表明它确实更新了早期角色的内存位置.

所以如果你预先初始化字符串,你不能这样做吗?这些字符串是否可以在使用它们时"从你身下移出",因为CLR假设它们是不可变的?这就是我想弄清楚的.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值