为什么不能将WideString用作互操作的函数返回值?
WideString
WideString
BSTR
BSTR
WideString
library WideStringTest;uses ActiveX;function TestWideString: WideString; stdcall;begin Result := 'TestWideString';end;function TestBSTR: TBstr; stdcall;begin Result := SysAllocString('TestBSTR');end;procedure TestWideStringOutParam(out str: WideString); stdcall;begin str := 'TestWideStringOutParam';end;exports TestWideString, TestBSTR, TestWideStringOutParam;beginend.
typedef BSTR (__stdcall *Func)();typedef void (__stdcall *OutParam)(BSTR &pstr);HMODULE lib = LoadLibrary(DLLNAME);Func TestWideString = (Func) GetProcAddress(lib, "TestWideString");Func TestBSTR = (Func) GetProcAddress(lib, "TestBSTR");OutParam TestWideStringOutParam = (Out Param) GetProcAddress(lib, "TestWideStringOutParam");BSTR str = TestBSTR();wprintf(L"%s\n", str);SysFreeString(str);str = NULL;TestWideSt ringOutParam(str);wprintf(L"%s\n", str);SysFreeString(str);str = NULL;str = TestWideString(); //fails herewprintf(L"%s\n", str);SysFreeString(str);
TestWideString
BSTRtest.exe中0x772015de处的未处理异常:0xC0000005:访问冲突读取位置0x00000000。
[DllImport(@"path\to\my\dll")][return: MarshalAs(UnmanagedType.BStr)]static extern string TestWideString();
ConsoleApplication10.exe中发生了“System.Runtime.InteropServices.SEHException”类型的未处理异常
附加信息:外部组件引发异常。
TestWideString
BSTR
Result
System._WStrAsg
CMP [EAX],EDX
EAX
$00000000
WideString
BSTR
白衣非少年