C# - 从BSTR获取字符串*

ube*_*ack 3 c#

在我正在研究的ac#应用程序中我正在使用API​​来提取客户信息,并且我试图获取用户电子邮件地址的字符串 - API文档声明我可以在一个对象上调用以下内容来撤回一个notefield string(电子邮件地址只能从此函数获取/设置)

HRESULT NoteField( [in] BSTR bstrFieldName, [out, retval] BSTR *pNoteField);
Run Code Online (Sandbox Code Playgroud)

但是当我在c#中调用它时,我得到一个空字符串

string email = object.NoteField["Email"]
Run Code Online (Sandbox Code Playgroud)

我怎样才能获得价值?

Rhu*_*orl 5

不受管理BSTR*和管理string不是一回事.你需要在两者之间进行转换.

Marshal.PtrToStringBSTRMarshal.StringToBSTR应该做你需要的.有点像:

IntPtr inPtr = Marshal.StringToBSTR("Email");
IntPtr outPtr = object.NoteField[inPtr];
// or you may need to do this
// IntPtr outPtr;
// object.NoteField(inPtr, out outPtr);

string email = Marshal.PtrToStringBSTR(outPtr);
Marshal.FreeBSTR(inPtr);
Marshal.FreeBSTR(outPtr);
Run Code Online (Sandbox Code Playgroud)

  • 为了安全起见,最好在分配周围使用`try-finally`块,这样如果在第1行之后发生异常并且外部捕获该错误并继续执行,则不会出现内存泄漏. (3认同)