我正在努力與我有一個託管接口通過COM暴露並由本機客戶端使用的方案。我已經成功地隔離問題,它基本上可以歸結爲一個字符串被不恰當地通過互操作的運行時間編組,以模擬和重現這個問題我已經創建了一個小項目,看起來像這樣:COM無法正確編組BSTR從託管服務器到本地客戶端
服務器:
[ComVisible(true)]
[Guid("5AF8A86E-B129-4FA0-8B6D-E9DF52DFDD84")]
public interface IUrlSync
{
void GetUrl(
[MarshalAs(UnmanagedType.BStr)] [Out] out string url
);
}
[ComVisible(true)]
[Guid("5AF8A86E-B129-4FA0-8B6D-E9DF52DFDD85")]
public class Urlsync : IUrlSync
{
private const string AddressHolderPath = "url.txt";
public Urlsync()
{
// nothing
}
public void GetUrl(out string url)
{
url = File.Exists(AddressHolderPath) ?
File.ReadAllText(AddressHolderPath) : null;
}
}
編譯該類和執行regasm + GACUTIL /我後,我已經建立了這個小
本機客戶端:
#include <Windows.h>
#import "../comstr/bin/release/comstr.tlb"
int main(int argc, char* argv[])
{
CoInitialize(NULL); {
BSTR bstr;
HRESULT hr = S_OK;
comstr::IUrlSyncPtr sync(__uuidof(comstr::Urlsync));
hr = sync->GetUrl(&bstr);
} CoUninitialize();
return 0;
}
這裏hr中的值是S_OK,而bstr被設置爲NULL(0x000000)。
爲了確保該問題與編組本身我已經建立
管理的客戶端:
,從不同的組件調用UrlSync類:
string bstr;
comstr.IUrlSync sync = new comstr.Urlsync();
sync.GetUrl(out bstr);
Console.WriteLine("the url is: {0}", bstr);
我得到預期的字符串。 我在這裏錯過了什麼?
它可能工作得很好,你的C++ EXE正在運行一個不同的默認目錄,所以File.Exists()返回false。給你預期的空字符串。 – 2012-01-03 22:55:50