none
API宣告方法差別 RRS feed

  • 問題

  • 下面虛線圍的程式碼可以播但是讀不到mp3的播放時間
    如果把mcisendstringa的宣告法改成程式碼2
    卻又可以讀到時間
    請問兩種宣告有何差別 ? 還是我使用有錯誤的地方?
    Thanks

    ---------------------------------------------------------------------
    Imports System.Runtime.InteropServices
    Module Module1
        <DllImport("winmm.dll")> _
            Public Function mciSendStringA(ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
        End Function
    End Module
       

    Imports System.IO      
    Public Class Form1
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            If OFD.ShowDialog() = DialogResult.OK Then  
                If Not (OFD.OpenFile Is Nothing) Then   
                    ListBox1.Items.Add(OFD.FileName)    
                    mciSendStringA("open " & OFD.FileName & " alias jen", vbNullString, 0, 0) 
                    mciSendStringA("play jen", vbNullString, 0, 0) 
                End If
            End If
            Timer1.Enabled = True
        End Sub
      
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            mciSendStringA("close jen", vbNullString, 0, 0)        
        End Sub

        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Dim mp As String                                
            mp = Space(256)                               
            mciSendStringA("status jen position", mp, Len(mp), 0)           
            Dim temp As Integer                                    
            temp = Int(Val(mp) / 1000)             
            Debug.Print(temp Mod 60)
        End Sub
    End Class
    ------------------------------------------------第1種方法結束------



    ----程式碼2------第2種 AP的宣告方法-------------------------------------------------------------------------------------------
    Public Declare Function mci Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long

    2009年6月16日 上午 01:49

解答

所有回覆

  • Hi,
    你可以在DllImport宣告那邊明確指定CharSet試試看;沒記錯的話DllImport陳述式如果沒有指定CharSet預設是用Ansi,Declare陳述式預設是用Auto。
    態度決定一切 ! - blog : http://bauann-makeit.blogspot.com/
    2009年6月16日 上午 02:39
    版主
  • dll function 使用問題
    http://social.msdn.microsoft.com/Forums/zh-TW/232/thread/049514e8-9b02-4667-829c-3d8ceafbdb86


    請問如何指定VB.net開發的應用程式,指定給某一個CPU Core處理?
    http://social.msdn.microsoft.com/Forums/zh-TW/232/thread/b4604f6d-ad72-4202-a7f6-ba3758db4b58

    這兩篇參考看看,ByRef和Integer也試試囉...
    2009年6月16日 上午 02:58
  • 您好,您的問題提到 [兩種宣告有何差別 ]

    參考此網頁 http://msdn.microsoft.com/zh-tw/library/172wfck9

    引述其中一段話

    DllImport 屬性會提供第二種方法,來呼叫沒有型別程式庫之 DLL 中的函式。DllImport 大致上等於使用 Declare 陳述式,但會對呼叫函式的方式提供較多的控制。
    您可在多數的 Windows API 呼叫中使用 DllImport,只要呼叫參考共用 (有時稱為「靜態」) 方法即可。您不能使用需要類別執行個體的方法。與 Declare 陳述式不同,[DllImport 呼叫無法使用 MarshalAs 屬性]。

    2009年6月16日 上午 05:08
    版主
  • 你需要把 VB6 的 Long 跟 VBNET 的 Long 分清楚,兩個並沒有相同,所以你兩個宣告都是錯的。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年6月16日 上午 05:11
  •  
    Private Declare Function mciSendStringA Lib "winmm.dll" _ 
     (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, _ 
    ByVal uReturnLength As Integer, ByVal hwndCallback As Integer) As Integer


    http://www.dotblogs.com.tw/larrynung/
    2009年6月16日 上午 07:26
  • 感謝大家幫忙

    (1) Long-->Integer :不行
    (2) 更改CharSet設定:不行

    所以目前並沒有解決
    還有其他方向可提供嗎?
    Thanks

    2009年6月28日 上午 09:05
  •  
    mciSendStringA("status jen position", mp, Len(mp), 0) 

    您說時間是這行嗎?在下用蹂躪大的宣告,可以播放也會顯示時間秒數...
    2009年6月28日 上午 10:28
  • 我的問題中有說明
    我用兩種API宣告法
    一個可以讀回時間
    一個不行
    你說的蹂躪大的宣告
    是本來就可以的
    我希望用DllImport也一樣可以
    感謝幫忙
    2009年7月1日 下午 01:03
  • 測過:

    <Runtime.InteropServices.DllImport("winmm.dll")> _

    Public Function mciSendString( _

      ByVal lpszCommand As String, _

      ByVal lpszReturnString As System.Text.StringBuilder, _

      ByVal cchReturn As UInt16, _

      ByVal hwndCallback As IntPtr _

      ) As Integer

    End Function

     

    Public Function mciStatus() As Integer

         Dim strBuffer As New System.Text.StringBuilder(256)

         Dim err As Integer = mciSendString("status jen position", strBuffer, strBuffer.Capacity + 1, IntPtr.Zero)

         If err = 0 Then Return CInt(strBuffer.ToString)

    End Function

     


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年7月1日 下午 02:35

  • 小弟有些疑問想請教一下

     mciSendString怎麼少一個A, 那不是API ?
     lpszReturnString的資料型態以前在VB6是String,怎之可改成System.Text.StringBuilder ?
     hwndCallback在VB6是Long,怎麼又可改成IntPtr ?
     感謝

    2009年8月3日 上午 06:21
  • 你的問題都可以在線上手冊中找到。

    API 中,跟字串有關的函數,都是一組兩個,例如 ApiNameA , ApiNameW ,A 字尾表示 ANSI ,W 字尾表示 Wide Char ,也就是 Unicode 。

    跟 VB6 有關的宣告變更,請先參考這篇:
    ms-help://MS.MSDNQTR.v90.cht/dv_vbvers/html/63613537-54a4-4aa7-a789-c1d5ff9cb210.htm
    升級建議:調整 Win32 API 的資料型別


    其他參看:
    ms-help://MS.MSDNQTR.v90.cht/dv_vbalr/html/9280ca96-7a93-47a3-8d01-6d01be0657cb.htm
    逐步解說:呼叫 Windows API

    ms-help://MS.MSDNQTR.v90.cht/dv_vbalr/html/27d75f0a-54ab-4ee1-b91d-43513a19b12d.htm
    HOW TO:呼叫 Windows API (Visual Basic)

    ms-help://MS.MSDNQTR.v90.cht/dv_vbalr/html/b324cc1e-b03c-4f39-aea6-6a6d5bfd0e37.htm
    互通性的疑難排解


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年8月3日 上午 07:04
  • 如果你是問上面的宣告,那是因為 .Net 的宣告方式會自動搜尋,所以詳見:
    ms-help://MS.MSDNQTR.v90.cht/fxref_system.runtime.interopservices/html/c5f9f76e-56dd-573f-c628-c89f818d0af9.htm
    DllImportAttribute.CharSet 欄位

    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年8月3日 上午 07:08
  • 真是非常感謝

    2009年8月5日 上午 04:58