2013-10-10 85 views
0

直到最近,我們還是將x86服務作爲服務運行,但將其更改爲任何使用64位DLL的新功能。剩下的第三方DLL之一是32位。我在註冊表中爲它設置了一個DLL替代品,但這只是解決方案的一半。在64位服務中使用32位DLL的指針

我懷疑內存中的指針是不可訪問的,因爲它不再運行inProc。我需要知道的是如何使用System.Runtime.InteropServices.Marshall對象來訪問返回的指針。

在此先感謝。

public Image GetThumbnail(string strFilename) 
    { 
     SeThumbnailExtractor objExtractor = new SeThumbnailExtractor(); 
     int hImageSE; 
     Image objImage = null; 
     try 
     { 
      objExtractor.GetThumbnail(strFilename, out hImageSE); 
      IntPtr iPImage = new IntPtr(hImageSE); 
      //fails below 
      objImage = Image.FromHbitmap(iPImage); 
      _ReturnedImage = objImage; 
      _SourceFile = strFilename; 
      Marshal.FreeHGlobal(iPImage); 
     } 
     catch (Exception ex) 
     { 
      _ErrorMsg = "ERROR: " + ex.Message.ToString(); 
     } 

     if (objExtractor != null) 
     { 
      System.Runtime.InteropServices.Marshal.ReleaseComObject(objExtractor); 
      objExtractor = null; 
     } 

     return objImage; 
    } 

回答

2

在代理中運行對正確實施的COM組件完全透明。組件的代理/存根可確保接口方法的參數和返回值由代理正確序列化爲互操作數據包,以便它可以在存根中再次進行分割和反序列化。

「正確實施」是一個難題。如果你從COM方法得到一個原始的位圖句柄或指針,那肯定會帶來麻煩。句柄或指針不能被序列化,它只在創建它的過程中有效。自定義代理/存根需要用實際位圖數據替換該句柄,將該數據傳輸到存根,以便在64位進程中使用新句柄/指針可以重新創建位圖。

COM組件作者處理這個問題的機率很小,這並不容易,他當時也沒有看到需求,因爲他認爲組件始終在進程中使用。現在不行了。

有沒有簡單的解決方法,你必須創建一個適當的代理/存根,並且需要至少訪問該組件的原始IDL。通常只有COM作者才能訪問它。壞消息,我敢肯定。

一種可能的解決方法是將其留給.NET來處理它。您將需要一個以32位模式運行的小型輔助程序進程,因此可以毫無困難地加載COM組件。使用.NET interop機制之一與之交談,如WCF或Remoting。獲取位圖序列化現在完全掌握在你的手中。

+0

謝謝你的清晰簡潔的解釋。我已經到了必須將程序的功能分成兩個服務的程度。 64位的主要功能,然後是一個小的32位的剩餘功能。我們被困在那裏直到供應商喚醒到64位計算。 – BigBadOwl