none
有關VB6-->VB.NET dll宣告的轉換問題 RRS feed

  • 問題

  • 請問我在VB6時 呼叫一個DLL檔 宣告如下

    Public Declare Function MYConfig Lib "MY.DLL" (ByVal A As String, ByVal B As Byte) As Boolean

    VB.NET 中我的宣告如下

       <DllImport("MY.dll")> Public Shared Function MYConfig( _
           
      <MarshalAs(UnmanagedType.AnsiBStr)> ByVal A As String, _
      <MarshalAs(UnmanagedType.AnsiBStr)> ByVal B As Byte) As Boolean
            End Function

    VB.NET呼叫方式如下

    Dim MyB as Byte

    Dim C as Boolean

    MyB=1

    C=MYconig(mytext.text,MyB)

    可是卻出現異常事件產生,說我參數二 為無法封送的形式

    請問是我的Marshal As宣告錯誤了嗎?

    2006年8月15日 上午 02:34

解答

  • AnsiBStr 是指字串採用 ANSI 的 BSTR ...

    Byte 是字串嗎?當然不是,那幹麻用這個屬性?

    在 VBNET 字串封送傳遞上有很大的變化,若你不清楚,就算 Byte 改對,也有可能無法呼叫。

    線上手冊有一節針對 Windows API 特別說明,裡面有一小節針對字串處理說明,建議你先看看。

    先練習呼叫不含陣列、字串的會比較好。

    很多情況下,例如字串變數是屬於 in/out 的,可能要用 StringBuilder 來建立初始化。

    目前你這樣宣告,並無法判斷是否正確。

     

    2006年8月15日 上午 03:42
    版主

所有回覆

  • AnsiBStr 是指字串採用 ANSI 的 BSTR ...

    Byte 是字串嗎?當然不是,那幹麻用這個屬性?

    在 VBNET 字串封送傳遞上有很大的變化,若你不清楚,就算 Byte 改對,也有可能無法呼叫。

    線上手冊有一節針對 Windows API 特別說明,裡面有一小節針對字串處理說明,建議你先看看。

    先練習呼叫不含陣列、字串的會比較好。

    很多情況下,例如字串變數是屬於 in/out 的,可能要用 StringBuilder 來建立初始化。

    目前你這樣宣告,並無法判斷是否正確。

     

    2006年8月15日 上午 03:42
    版主
  • 感謝大大的提示,可以麻煩告訴我哪一小節嗎  我有裝MSDN ,可以把連結post出來嗎?

     

    2006年8月15日 上午 05:38
  • ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.cht/dv_vbalr/html/9280ca96-7a93-47a3-8d01-6d01be0657cb.htm

    ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.cht/dv_vbalr/html/27d75f0a-54ab-4ee1-b91d-43513a19b12d.htm

    上方有個與目錄同步處理的按鈕,按下去還可以看目錄上下節來做更進一步了解

    2006年8月15日 上午 07:29
    版主