我正在尝试使用COM调用在C#中使用IFileDialogCustomize接口。我调用GetEditBoxText(id,buffer)定义为:
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
HRESULT GetEditBoxText([In] int dwIDCtl, [Out] IntPtr ppszText);
我从https://msdn.microsoft.com/en-us/library/windows/desktop/bb775908(v=vs.85).aspx获得了
我写的代码是:
IntPtr buffer = Marshal.AllocCoTaskMem(sizeof(int));
string textboxString;
var customizeDialog = GetFileDialog() as IFileDialogCustomize;
if (customizeDialog != null)
{
HRESULT result = customizeDialog.GetEditBoxText(id, buffer);
if (result != HRESULT.S_OK)
{
throw new Exception("Couldn't parse string from textbox");
}
}
textboxString = Marshal.PtrToStringUni(buffer);
Marshal.FreeCoTaskMem(buffer);
return textboxString;
该字符串始终返回奇数字符,例如벰∔。
我是使用Com接口的新手,还没有做过C ++编程,所以我在这里有点迷失。为什么我没有从文本框中获取实际字符串?
答案 0 :(得分:1)
我明白了。这是Jacob所说的和改变Com调用签名的组合。而不是
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
void GetEditBoxText([In] int dwIDCtl, [Out] IntPtr ppszText);
我需要签名:
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
HRESULT GetEditBoxText([In] int dwIDCtl, out IntPtr ppszText);
实际上正确地传递了IntPtr并且我能够使用
获取字符串 Marshal.PtrToStringUni(buffer);