none
如何使用 RAPI 以新增到Windows CE 5.0 裝置上登錄機碼和值 RRS feed

  • 問題

  •  

    各位先進:

       我從微軟技術網站上取得以下程式碼實作,  VB.NET 上已經沒有StrPtr此函數, 請問有別的函數可用, 或是別的方法可以新增登錄機碼和值到win ce 5.0的裝置上嗎?

     

    Option Explicit

    Private Sub Command1_Click()
           Dim lret As Long
           Dim lcon As Long
          
           ' Initialize RAPI
           lcon = ConnectRapi
           If lcon <> ERROR_SUCCESS Then
              MsgBox "Failure to initialize RAPI"
           Else
              MsgBox "RAPI was initialized successfully"
           End If
          
           lret = CreateCERegistryKeys
          
            ' Uninitialize RAPI
           lcon = DisconnectRapi
           If lcon <> ERROR_SUCCESS Then
              MsgBox "Failure to uninitialize RAPI"
           Else
              MsgBox "RAPI was uninitialized successfully"
           End If
    End Sub

    Public Function CreateCERegistryKeys() As Long
        Dim lret As Long
        Dim phkResult As Long
        Dim phskResult As Long
        Dim subkey As String
        Dim key As String
        Dim lpclass As String
        Dim lpdwdisposition As Long
        Dim Value As String
        Dim sData As String
        Dim lData As Long

        'Create a key named "MyKey" under HKEY_LOCAL_MACHINE
        key = "MyKey"
        lpclass = "MyKeyClass"
        lret = CeRegCreateKeyEx(HKEY_LOCAL_MACHINE, StrPtr(key), _
            0, StrPtr(lpclass), 0, 0, 0, phkResult, lpdwdisposition)

        If lret <> ERROR_SUCCESS Then
            MsgBox "Failure to create key.  Error: " & lret
        Else
            'Create the subkey
            subkey = "MySubKey"
            lpclass = "SubKeyClass"
            lret = CeRegCreateKeyEx(phkResult, StrPtr(subkey), _
                0, StrPtr(""), 0, 0, 0, phskResult, lpdwdisposition)
           
            If lret <> ERROR_SUCCESS Then
                MsgBox "Failure to create sub key: " & _
                subkey & "  Error: " & lret
            Else
                'Add a string value to the subkey
                Value = "Name"
                sData = "John Smith"
                lret = CeRegSetValueEx(phskResult, StrPtr(Value), 0, _
                    REG_SZ, StrPtr(sData), (Len(sData) + 1) * 2)
                'Add a DWORD value to the subkey
                Value = "Age"
                lData = 23
                lret = CeRegSetValueEx(phskResult, StrPtr(Value), 0, _
                REG_DWORD, VarPtr(lData), 4)
            End If
           
        End If
       
        CreateCERegistryKeys = lret
    End Function

    2008年2月21日 上午 07:56

解答

所有回覆

  • Hi,

    您可以參考看看OpenNetCF的OpenNETCF.Desktop.Communication Library

     

    2008年2月21日 上午 08:57
    版主
  • Dear:

    我用了OpenNETCF.Desktop.Communication的元件 執行的時候會出現找不到 PInvoke DLL 'rapi.dll'。

    sample code 如下:

            Dim platkey As CERegistryKey = CERegistry.LocalMachine.OpenSubKey("Platform")
            Dim platname As String = platkey.GetValue("Name")
            MsgBox(platname)
            platkey.Close()

    2008年2月21日 上午 09:53
  • Hi,

    你有把OpenNETCF.Desktop.Communication.dll放在跟執行檔相同的目錄裡面嗎?

     

    2008年2月21日 上午 11:30
    版主
  • Dear :

      是的, 我將它放在和exe一樣的目錄底下.

    2008年2月21日 上午 11:43
  • Dear:

      rapi 是不是要先Init 才能使用

    2008年2月21日 上午 11:45
  • Dear:

       我使用二種方法叫用 CeRapiInitEx, 傳入參數是一個Structure, 均會在給 cbsize 預設值的時候當掉.

     

        Private Declare Function CeRapiInitEx Lib "rapi.dll" (ByVal pRapiInit As RAPIINIT) As Long

        Private Structure RAPIINIT
            Public cbsize as long
            Public hrRapiInit as long
            Public hrRapiInit As Long
        End Structure

     

        ' Initialize RAPI
        Public Function ConnectRapi() As Long
            Dim lcon As Long
            Dim lRapiInit As RAPIINIT

            With lRapiInit
                .cbsize = Len(lRapiInit) ----> 當在此行 (型別不符。)
                .heRapiInit = 0
                .hrRapiInit = 0
            End With

            lcon = CeRapiInitEx(lRapiInit)
            ConnectRapi = lcon
        End Function

     

        Public Function InitDevice(ByVal nTimeout As Integer) As Boolean

            Dim ri As New RAPIINIT()
            ri.cbsize = System.Runtime.InteropServices.Marshal.SizeOf(ri) -->當在此行(NotSupportedException)

            Dim hRes As UInteger
            hRes = CeRapiInitEx(ri)
            Dim meInit As System.Threading.ManualResetEvent
            meInit = New System.Threading.ManualResetEvent(False)
            meInit.Handle = ri.heRapiInit

            If Not meInit.WaitOne(nTimeout, True) Then
                CeRapiUninit()
                Return False
            Else
                Return True
            End If
        End Function

     

     

    2008年2月21日 上午 11:58
  • Hi,

    確定一下,你是要開發桌上型的應用程式,透過ActiveSync連接Device然後去新增RegistryKey對吧?

    是的話,下面是一個簡單的範例

    Code Snippet

    Imports OpenNETCF.Desktop.Communication
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim K As CERegistryKey
            Dim myRAPI As New OpenNETCF.Desktop.Communication.RAPI
            If myRAPI.Connected = False Then
                myRAPI.Connect()
            End If
            K = CERegistry.CurrentUser.CreateSubKey("Test")
            K.SetValue("123", 123)
            myRAPI.Disconnect()
        End Sub

     

     

     

    2008年2月21日 下午 12:40
    版主
  • Dear :

       不, 我是開發wince 5.0上的應用系統, 此應用系統要直接新增RestryKey至裝置上, 我想我好像搞錯了, 是嗎?

    是不是不該用OpenNETCF.Desktop.Communication, 而是直接用OpenNETCF

    2008年2月22日 上午 01:01
  • Dear :

       All my fault, 我把事情搞複雜了, 直接引用OpenNETCF 即可新增RegistryKey了, 謝謝你點出我的問題, 我Try了一整天. 終於弄懂了, 謝謝你. , 想報答你!

    2008年2月22日 上午 01:17