为了账号安全,请及时绑定邮箱和手机立即绑定

C# Pinvoke 字符串

C# Pinvoke 字符串

C#
牧羊人nacy 2022-10-23 13:24:30
我正在尝试使用 PInvoke 绑定此 C 函数。bool GuiTextBox(Rectangle bounds, char *text, int textSize, bool editMode);这是 PInvoke 签名。[DllImport(nativeLibName,CallingConvention = CallingConvention.Cdecl)]public static extern bool GuiTextBox(Rectangle bounds,                                       string text,                                       int textSize,                                       bool freeEdit);当我尝试使用它时,字符串不会被修改。我尝试将它作为 ref 传递,但是当我尝试使用它时它会因尝试读取或写入受保护的内存而崩溃。
查看完整描述

1 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

我希望它应该是这样的:


// private : do not expose inner details; 

// we have to manipulate with StringBuilder

[DllImport(nativeLibName,

           CallingConvention = CallingConvention.Cdecl,

           EntryPoint = "GuiTextBox",

           CharSet = CharSet.Unicode)] //TODO: Provide the right encoding here

private static extern bool CoreGuiTextBox(Rectangle bounds, 

                                          StringBuilder text, // We allow editing it

                                          int textSize, 

                                          bool freeEdit);


// Here (in the public method) we hide some low level details

// memory allocation, string manipulations etc.

public static bool CoreGuiTextBox(Rectangle bounds, 

                                  ref string text, 

                                  int textSize, 

                                  bool freeEdit) {

  if (null == text)

    return false; // or throw exception; or assign "" to text


  StringBuilder sb = new StringBuilder(text);  


  // If we allow editing we should allocate enough size (Length) within StringBuilder

  if (textSize > sb.Length)

    sb.Length = textSize;


  bool result = CoreGuiTextBox(bounds, sb, sb.Length, freeEdit);   


  // Back to string (StringBuilder can have been edited)

  // You may want to add some logic here; e.g. trim trailing '\0'  

  text = sb.ToString();


  return result;

}


查看完整回答
反对 回复 2022-10-23
  • 1 回答
  • 0 关注
  • 72 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信