none
請教一下vb.net 封裝dll給dephi使用的問題 RRS feed

  • 问题

  • 請教一下各位大大 今天碰到一個問題 問題如下

    有一個pc-base的控制板 安裝在電腦上 技術手冊上講解我需要用dll 裡的API去控制馬達的動作

    但問題來了 這塊卡的廠商本身有用vb.net去寫幾個範例檔 基本上就是調用這個dll 的API出來使用

    利用這個範例檔去發送指令 基本上是有效的 動作有出來 但是用dephi呼叫這個dll裡的API卻無效了

    動作都沒出來 

    

    我本身有用depend去觀察裏頭的API 都很正常 遽我目前谷歌後的資訊 dephi 對於任何dll都應該是相當友善的 

    但是現在用dephi 去調用這些API就是無法正常工作 所以我在想是否可以將已經可以正常工作的Vb.net的代碼

    封裝成dll 讓dephi去調用  這裡有個觀念 我不是很理解 就是說當dephi去調用vb封裝起來的dll 他是等於執行.net核心處理的代碼嗎 不是透過dephi的核心去執行這些dll裡的代碼 可以這樣理解嗎?

    另外 我不是很清楚VB.net 要怎麼封裝成 function  給dephi調用 希望這些知識希望有高手能不佞賜教


    • 已编辑 向恩 2014年1月9日 15:11
    2014年1月9日 15:10

全部回复

  • 应该是你调用 dll 时的参数不对,或者少了某些初始化步骤。你应该仔细读读 VB.NET 的示例代码,看看还有哪些你没注意到的。

    如果你想通过 dephi 调用 VB.NET 的 dll 的话,你只能使用 COM 技术,也就是用 VB.NET 制作成 COM 组件,然后 dephi 调用 COM 组件。

    2014年1月10日 3:14
  • 我現在已經開始嘗試用vb.net 封裝成com 組件給dephi 調用的工作

    但是目前還在摸索中 我操作的程序是 先利用類別庫 然後刪除那個class 

    加入一個com 類別 他有自動生成一些代碼如下

    <ComClass(ComClass1.ClassId, ComClass1.InterfaceId, ComClass1.EventsId)> _
    Public Class ComClass1

    #Region "COM GUID"
        ' 這些 GUID 提供了這個類別的 COM 識別
        ' 與其 COM 的介面。如果您變更這些設定,現有的
        ' 用戶端將無法再存取該類別。
        Public Const ClassId As String = "08ed62a2-9c32-4de4-916e-6dd2e3cccf88"
        Public Const InterfaceId As String = "a32c9400-0faf-4eac-90e7-36f9060b734f"
        Public Const EventsId As String = "8f47783c-fb71-4ee9-9bc7-08e98d84c437"
    #End Region

        ' 可建立的 COM 類別必須要有一個沒有參數的 Public Sub New(),
        ' 否則,該類別將無法於 COM 登錄中予以登錄,
        ' 而且也無法透過
        ' CreateObject 來建立該類別。
        Public Sub New()
            MyBase.New()
        End Sub

    然後我將要輸出的sub 也寫在這個檔案裡 我不曉得這個做法正不正確

    生出這個com 的 Dll 檔及tlb檔後

    然後利用vs內帶的vs提示字元去生成 .reg 的註冊檔 

    拿到目標主機去註冊 

    剛剛遇到的問題是dephi 7好像版本太舊不能調用dll

    更改成dephi 2010後 經過下面這道程序

    Project|Import Type Library

    去調用這個tlb檔可以拉進來 產生com元件了

    目前還在摸索相關的代碼 不曉得我目前的程序上 有沒有錯誤 如有錯誤

    還請指正 或如果有其他有幫助的信息 也希望各位大大能提供資訊給予幫助 謝謝!


    2014年1月10日 6:04
  • 我把我封裝的com 編譯檔上傳到空間 提供各位大大做分析

    com 檔


    剛剛使用了dephi 去呼叫這個com 

    dephi 2010好像要把tlb檔叫進來才能使用

    有在介面上看到這個com 

    但是出現了一些奇怪的錯誤信息 不知道是什麼狀況??

    我在這個com 裡有呼叫其他的dll 設計的API 

    不曉得這個錯誤是不是呼叫其他的dll 失敗造成的

    補充一點 我這邊已經把這裡要用到所有的Dll 跟相關檔案包含tlb檔放在一起了..

    還是出現上面那個錯誤

    2014年1月10日 6:59
  • 我目前這個com 的設計 就是參考這篇的做法下做弄得 並且生成了了dll

    Question
    您無法為自己的文章投票
    0

    以上是我參考下面這個連結去弄得

    com註冊

    我先在自己的電腦註冊這個com 看起來是成功的 然後我把它生成一個reg註冊檔 將這個dll及註冊檔

    一起放到了目標主機上安裝 它也是成功的..   但結果是dephi 編譯器上產生很多錯誤

    但我有注意到一篇文章 下面這篇

    連結

    它寫了共用組件及私用組件這兩個類型 然後有一個這樣的工具 Gacutil.exe

    我在想是不是要把它弄成共用組件才能使用阿 我不太懂這塊

    所以我就參考了上面這個Gacutil去弄弄看

    但結果是失敗的..  不太清楚這塊的用法

    2014年1月12日 4:16
  • 你的 COM 注册可能有问题,你需要查看你的注册表项,确保 CodeBase 是指向你的程序集的全路径。
    2014年1月13日 3:36
  • 這個 Gacutil.exe 我已經測出來了

    我參考了下面這篇文章

    com 註冊成全域com

    但是有其他網友告訴我這個是不需要的 他們請我用下面這個工具測試 

    ActiveX Control Test Container工具

    但是我怎麼測都沒看到這個com  我找不到這個com

    2014年1月13日 9:29
  • 這個 Gacutil.exe 我已經測出來了

    我參考了下面這篇文章

    com 註冊成全域com

    但是有其他網友告訴我這個是不需要的 他們請我用下面這個工具測試 

    ActiveX Control Test Container工具

    但是我怎麼測都沒看到這個com  我找不到這個com


    你实可以不用在全局程序集中安装后再注册,但是你在使用 regasm 注册时的 codebase 一定要是你的程序集的物理路径。
    2014年1月13日 9:38
  • 你的意思是要引用的應用程式的程序集的路徑要能對應到這個路徑嗎?

    我現在把這個dll 放在這個路徑 C:\Windows\System32

    意思是應用程式也要能對應到這個路徑的dll?

    2014年1月13日 11:59
  • 你的意思是要引用的應用程式的程序集的路徑要能對應到這個路徑嗎?

    我現在把這個dll 放在這個路徑 C:\Windows\System32

    意思是應用程式也要能對應到這個路徑的dll?


    http://blog.csdn.net/cwzmb/article/details/6106534
    2014年1月14日 1:22
  • 所以意思是只要註冊了這個com的dll 不管這個dll放在哪個資料夾

    應用程式應該都可以呼叫得到它 應該是這麼理解的吧.

    可是奇怪的是我的確註冊了這個com組件

    有其他網友告訴我可以用 ActiveX Control Test Container 這個工具去檢查

    但是還是沒找到這個組件

    2014年1月14日 12:42
  • 所以意思是只要註冊了這個com的dll 不管這個dll放在哪個資料夾

    應用程式應該都可以呼叫得到它 應該是這麼理解的吧.

    可是奇怪的是我的確註冊了這個com組件

    有其他網友告訴我可以用 ActiveX Control Test Container 這個工具去檢查

    但是還是沒找到這個組件

    ActiveX Control Test Container 是测试 ActiveX 控件的,这只是 COM 组件的一个分支。

    http://www.cnblogs.com/homer/archive/2005/01/04/86473.html

    http://blog.163.com/jtyp_2000/blog/static/9910426201099105652680/

    2014年1月15日 2:02
  • 這兩篇好像都是寫active控件的內容 那我本身將程式包成com 的dll組件  

    我不清楚到底能不能用用這個ActiveX Control Test Container 來進行測試..

    2014年1月15日 18:56
  • 這兩篇好像都是寫active控件的內容 那我本身將程式包成com 的dll組件  

    我不清楚到底能不能用用這個ActiveX Control Test Container 來進行測試..

    ActiveX Control Test Container 是测试 ActiveX 控件的,这只是 COM 组件的一个分支。

    我以为我已经表达的很清楚了,但是好像你还是看不明白,那我就告诉你——不能。

    但是你可以简单使用 VB Script 来测试,打开你的 Excel,打开 VBA ,输入代码:

    Dim cipher As Object

    cipher = CreateObject("你的组件的 ProgId")

    cipher = Nothing



    • 已编辑 Skyseer 2014年1月16日 3:01
    2014年1月16日 3:01
  • 這兩篇好像都是寫active控件的內容 那我本身將程式包成com 的dll組件  

    我不清楚到底能不能用用這個ActiveX Control Test Container 來進行測試..

    ActiveX Control Test Container 是测试 ActiveX 控件的,这只是 COM 组件的一个分支。

    我以为我已经表达的很清楚了,但是好像你还是看不明白,那我就告诉你——不能。

    但是你可以简单使用 VB Script 来测试,打开你的 Excel,打开 VBA ,输入代码:

    Dim cipher As Object

    cipher = CreateObject("你的组件的 ProgId")

    cipher = Nothing



    那有什麼方法可以檢查我建置的com 組件有沒有設置成功呢?

    大大寫的這段代碼應該也是檢驗activex控件的吧.

    2014年1月16日 4:26
  • 這兩篇好像都是寫active控件的內容 那我本身將程式包成com 的dll組件  

    我不清楚到底能不能用用這個ActiveX Control Test Container 來進行測試..

    ActiveX Control Test Container 是测试 ActiveX 控件的,这只是 COM 组件的一个分支。

    我以为我已经表达的很清楚了,但是好像你还是看不明白,那我就告诉你——不能。

    但是你可以简单使用 VB Script 来测试,打开你的 Excel,打开 VBA ,输入代码:

    Dim cipher As Object

    cipher = CreateObject("你的组件的 ProgId")

    cipher = Nothing



    那有什麼方法可以檢查我建置的com 組件有沒有設置成功呢?

    大大寫的這段代碼應該也是檢驗activex控件的吧.

    实在是对不起,请你到微软的 All code in one 中找到使用 C++ 编写 COM 组件的示例项目,然后编译并安装,然后用上面的 VBA 代码测试。
    2014年1月16日 7:15
  • 我自己又重新寫一個新的com 這次這個寫得比較簡單 先讓VB6去調用 測試結果已經成功了

    而且不用註冊 只要在VB6底下引用創建的tlb檔就好

    2014年1月16日 16:44