none
請教一個C++轉VB.NET的問題(引用Dll的API) RRS feed

  • 問題

  • Code Snippet

    DWORD WINAPI comm_ScanUSBPortCount();

    HANDLE WINAPI comm_OpenChannel(DWORD dwIoType, LPSTR szParam1, DWORD dwParam2, HWND hAppWnd);

    HANDLE WINAPI comm_ConnectServer(DWORD dwIoType, LPSTR szParam1, DWORD dwParam2, HWND hAppWnd);

    DWORD WINAPI comm_DownloadFile(HANDLE hComm, LPSTR szSourceFile, LPSTR szDestFile, DWORD dwAttr);

     

     

     

    您好,因為小弟是學VB.NET的,所以C#有點問題...

    以上是 XXX.DLL 的宣告,只是他的語言是C#,我想改成VB.NET,只是有些型態我不是很懂,請指教

     

    1. HANDLE WINAPI comm_OpenChannel(DWORD dwIoType, LPSTR szParam1, DWORD dwParam2, HWND hAppWnd);

         請問裡面LPSTR是什麼型態,改成VB要宣告成什麼??

     

    2. HANDLE hComm, LPSTR szSourceFile, LPSTR szDestFile, DWORD dwAttr  這句可以幫我解釋一下嗎??我不了解 HANDLE 放在這的意思

     

     

    2008年11月12日 上午 01:19

解答

  • 1.

    範例: C++ 的   LPSTR  在  VB.NET  宣告成  System.Text.StringBuilder

    Code Snippet

    'Your declaration is wrong... It should be:

    ' you should put this in the search path so that you don't have
    ' to hardcode a path


    Declare Ansi Function test Lib "IOComm.dll" _
            (ByVal a As IntPtr, _
             ByVal b As System.Text.StringBuilder) As Integer


     

    'Then you would call it something like


     

    Dim portHnd As IntPtr
    Dim buffer As New System.Text.StringBuilder (256)
    Dim ret = test (portHnd, buffer)

    Console.WriteLine (buffer.ToString())

     

     

    Code Snippet

     

     

     

     

     

    2.

        HANDLE  是指 妳所開啟的 USBPort 之Handle

    2008年11月12日 上午 01:42
  • '  WORD = 16 Bit

     ' DWORD = 32 Bit 

     

    Dim instance As UInt32

    2008年11月12日 上午 03:32
  • 這並沒有一定。

     

    lpStr 是 long pointer string ,也可以宣告成 Byval xxx As String

     

    DWORD 可以用 Integer / Int32 / UInt32 ,除非要處理內容,否則基本上我都直接用 Integer

     

    hWnd 是 handle of window ,可以用 Integer(同上) 或 IntPtr ,看你如何取得 hWnd 或你打算如何用 hWnd ,一般來說宣告成 IntPtr ,但你要是把 hWnd 當 Integer 也是可以。

    2008年11月12日 上午 03:46
  •  

    Dim hAppWnd As IntPtr

    2008年11月12日 上午 03:47

所有回覆

  • 1.

    範例: C++ 的   LPSTR  在  VB.NET  宣告成  System.Text.StringBuilder

    Code Snippet

    'Your declaration is wrong... It should be:

    ' you should put this in the search path so that you don't have
    ' to hardcode a path


    Declare Ansi Function test Lib "IOComm.dll" _
            (ByVal a As IntPtr, _
             ByVal b As System.Text.StringBuilder) As Integer


     

    'Then you would call it something like


     

    Dim portHnd As IntPtr
    Dim buffer As New System.Text.StringBuilder (256)
    Dim ret = test (portHnd, buffer)

    Console.WriteLine (buffer.ToString())

     

     

    Code Snippet

     

     

     

     

     

    2.

        HANDLE  是指 妳所開啟的 USBPort 之Handle

    2008年11月12日 上午 01:42
  • 謝謝cmf大大的回覆,還有一問題跟你請教...

     

    Code Snippet

    'C# ==>

    ( DWORD dwIoType, LPSTR szParam1, DWORD dwParam2, HWND hAppWnd )

    'VB==>

     ( Byval dwlotype as DWORD,Byval szParam1 as System.Text.StringBuilder,Byval dwParam2 as DWORD ,Byval hAppWnd  as  HWND )

     

     

     

     

    請問紅色的資料型態要怎樣修改??

    2008年11月12日 上午 03:09
  • '  WORD = 16 Bit

     ' DWORD = 32 Bit 

     

    Dim instance As UInt32

    2008年11月12日 上午 03:32
  • 感謝cmf大大為我解惑,抱歉剛剛少MARK一個形態,那就是 HWND

     

    要怎樣修改呢??

    2008年11月12日 上午 03:40
  • 這並沒有一定。

     

    lpStr 是 long pointer string ,也可以宣告成 Byval xxx As String

     

    DWORD 可以用 Integer / Int32 / UInt32 ,除非要處理內容,否則基本上我都直接用 Integer

     

    hWnd 是 handle of window ,可以用 Integer(同上) 或 IntPtr ,看你如何取得 hWnd 或你打算如何用 hWnd ,一般來說宣告成 IntPtr ,但你要是把 hWnd 當 Integer 也是可以。

    2008年11月12日 上午 03:46
  •  

    Dim hAppWnd As IntPtr

    2008年11月12日 上午 03:47
  • 再請教cmf大大~

    1.您說:HANDLE  是指 妳所開啟的 USBPort 之Handle,我不是很懂您的意思,可以幫我說明一下嗎??

     

    2.HANDLE hComm, ByVal szSourceFile as String,ByVal szDestFile as String, ByVal dwAttr as Integer

       請問紅色這裡要怎樣修改呢??

     

     

    2008年11月12日 上午 05:50
  • 1.

     

    dim  hComm As IntPtr

    hComm =  comm_OpenChannel(XXXXXX...

     

     

    2

     

    ByVal  hComm  As IntPtr  , ByVal szSourceFile as String,ByVal szDestFile as String, ByVal dwAttr as Integer

     

     

     

     

     

    2008年11月12日 上午 05:57
  • 後來我網路上查到,他應該也類似HWND

    謝謝您,馬上為我解惑...感恩

    2008年11月12日 上午 06:00
  • 怎麼看
    這些宣告是C++的咧
    怎麼是C#
    2008年11月12日 上午 06:02
  • 好像是 Windows SDK 教學?

     

    handle 直接翻你可能不好會意,你就把它當代號、代碼即可。

    比如說學生有學號,這是校方在用,有座號,這是導師在用。學號、座號就是代號。

     

    所以:

    一個開啟的檔案,就會有檔案代號,也就是 handle of file ,常記作 hFile 。

    一個執行中的程序,就會有程序代號,常記作 hProcess 。

    一個建立後的視窗,常記作 hWnd 。

    註:常記作 hXXX 的原因是在 C include 檔中有定義。

     

    所有 API 或 SDK 這類的速記都是一樣的。

    而沒有寫 hXXX 的,寫 Handle 的,表示目前沒有常用的宣告可以速記,但意義相同,就是代號。

     

    既然是代號,實際的意義就是數值,所以宣告成 Integer 即可。

     

    到了 VBNET 後,部分型別用 IntPtr 宣告,例如 PictureBox.Image.Handle 等,就變成有人喜歡用 IntPtr 來宣告,但是實際上 IntPtr 在使用上不見得好用,所以看情況,一般呼叫過程中,不用另外處理的,且前後所需用到的變數型態是 IntPtr 時,就會宣告成 IntPtr ,如有其他用途,就會宣告成 Integer 或 UInt32 等。

     

    而宣告成 IntPtr / Integer 看前後用途就是懶得轉換而已。

    2008年11月12日 上午 06:32