2012-01-01 54 views
3

我正在努力與我有一個託管接口通過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); 

我得到預期的字符串。 我在這裏錯過了什麼?

+0

它可能工作得很好,你的C++ EXE正在運行一個不同的默認目錄,所以File.Exists()返回false。給你預期的空字符串。 – 2012-01-03 22:55:50

回答

2

我已經構建了您的示例程序,並發現它實際上按預期工作。然而你的程序有一些問題。

如果該文件不存在,您實際上會得到您當前遇到的null響應。情況會是這樣嗎?考慮到運行時間文件夾可能與您作爲額外測試構建的受管客戶端不同。

您可以簡單地通過調試器中的兩個項目來查看發生了什麼。

#進口語句生成編組代碼拋出_com_error例外,你不捕捉。

希望這會有所幫助。

+0

情況並非如此。當我將url的值顯式設置爲字符串文字時,它返回NULL事件。 – 2012-01-04 03:43:24

+1

我建議你開始調試。確保將「調試器類型」設置爲「混合」,使您能夠調試本機客戶端代碼和受管服務器代碼。 – 2012-01-04 07:59:20

相關問題