none
請問Delphi程式要如何與C# (2005) 溝通呢? RRS feed

  • 問題

  • 請問各位大大?

    Delphi程式可以跟C# (2005) 溝通嗎?

    除了使用DLL之外!因為Delphi程式是別的公司寫的,

    不過有提供程式碼....

    也就是說Delphi裡丟出陣列值C#可以讀取到此陣列值,

    也可以控制Delphi裡的方法或程序?

    請教一下??

     

    2007年7月4日 上午 01:01

解答

  • 如果只是讓兩個程式資料互通, 可以用 Memory-Mapped File 來做.

    1. 在 Delphi 端, 請到 http://www.delphi32.com/vcl/2319/ 下載這個元件. 裡面有使用範例.

    2. 在 C# 端, 請到 http://addressof.com/blog/archive/2003/05/01/164.aspx, 有個人家包好的元件, 裡面也有使用範例.

    3. 然後 Memory-Mapped File 開相同的檔名, 就會用到同一塊 Memory, 資料即可互通. 不過那個 C# 元件可能要稍微
    加工一下, 才會比較適用.

    4. 上面這個方法, 只能做到資料交換, 不能夠互相呼叫. 有個偷懶的方式, 就是兩邊的程式各放一個 Timer, 每隔一段時間去 check 資料, 看看有沒有變化? 需不需要處理?
         對於不好轉成 COM, 或是不方便轉的狀況, 這是一個可以用的方法,

    5. 關於 Memory-Mapped File, 請參考 http://msdn2.microsoft.com/en-us/library/ms810613.aspx

    2007年7月4日 上午 10:07

所有回覆

  • 這個你就得考慮行程間通訊(Inter-process communication),這實作起來比較複雜。

    不過有個前提,就是 Delphi 程式必須要是 EXE 可執行檔,DLL 是不行的。

     

    如果有程式碼的話,不妨把 DLL 改成 COM 類型的,這樣就可以直接引用。

    2007年7月4日 上午 02:32
    版主
  • 請問小朱大大

    Delphi程式是可以EXE執行檔,但是我不知道如何將Delphi的執行檔引用在C#的程式裡?

    如果Delphi程式一半左右不是用API寫的話,那麼也可以改成COM嗎?

    改成COM會很難嗎?

     

    2007年7月4日 上午 02:41
  • Delphi 我沒在寫,所以我不知道。

    你可能要參考一下 Delphi 的書籍或文件,但我可以確信 Delphi 的程式是可以輸出成 COM 元件。

     

    前面也已經提過了,不是 COM 的元件是不可以引用的,

    所以 EXE 若沒有 COM Automation 介面的話是不可引用。

    但像 Word/Excel 的可執行檔就是可引用的 COM 元件,但通常廠商會另外輸出一個型別函式庫(Type Library),

    所以你可以去問問程式的供應商,看看能否輸出 COM 元件類型的程式碼。

    如果不行,就自己試著轉吧。

     

    2007年7月4日 上午 02:50
    版主
  • 其實DELPHI是我們公司的人寫的...

    不過他好像不太會用COM+.

    他是叫我用DDE,

    不過以上兩項方法都找過,目前也很少人在用,

    所以根本找不太到方法.....

    呵.....

    其實我們的目的''是要用Delphi執行時,C#或VB可以知道Delphi在呼叫它們,然後將Delphi裡的資料讀取判斷在存資料庫中..''

     

    2007年7月4日 上午 04:21
  • COM 和 COM+ (Component Service) 是兩回事,不要混為一談。

    你可以考慮用 Inter-process communication 來實作吧。

    2007年7月4日 上午 05:13
    版主
  • 如果只是讓兩個程式資料互通, 可以用 Memory-Mapped File 來做.

    1. 在 Delphi 端, 請到 http://www.delphi32.com/vcl/2319/ 下載這個元件. 裡面有使用範例.

    2. 在 C# 端, 請到 http://addressof.com/blog/archive/2003/05/01/164.aspx, 有個人家包好的元件, 裡面也有使用範例.

    3. 然後 Memory-Mapped File 開相同的檔名, 就會用到同一塊 Memory, 資料即可互通. 不過那個 C# 元件可能要稍微
    加工一下, 才會比較適用.

    4. 上面這個方法, 只能做到資料交換, 不能夠互相呼叫. 有個偷懶的方式, 就是兩邊的程式各放一個 Timer, 每隔一段時間去 check 資料, 看看有沒有變化? 需不需要處理?
         對於不好轉成 COM, 或是不方便轉的狀況, 這是一個可以用的方法,

    5. 關於 Memory-Mapped File, 請參考 http://msdn2.microsoft.com/en-us/library/ms810613.aspx

    2007年7月4日 上午 10:07
  • 好像可以喔!

    我去研究一下..

    謝謝啦!

     

    2007年7月4日 上午 10:34