DOCUMENT:Q306368 11-SEP-2001 [vbwin] TITLE :HOWTO: Use RAPI to Add Keys and Values to the Remote Registry PRODUCT :Microsoft Visual Basic for Windows PROD/VER::2.0,2.11,3.0,6.0 OPER/SYS: KEYWORDS:kbDSupport ====================================================================== ------------------------------------------------------------------------------- The information in this article applies to: - Microsoft Visual Basic Enterprise Edition for Windows, version 6.0 - Microsoft Visual Basic Professional Edition for Windows, version 6.0 - Microsoft Windows CE Operating System versions 2.0, 2.11, 3.0 ------------------------------------------------------------------------------- SUMMARY ======= You can use the Remote APIs (RAPI) from Visual Basic to add keys and values to the registry on remote Windows CE-based devices, such as a Pocket PC. This article demonstrates how to call the RAPI functions to add keys, subkeys, and string and DWORD values to the registry on the remote devices. MORE INFORMATION ================ WARNING: One or more of the following functions are discussed in this article; VarPrt, VarPtrArray, VarPtrStringArray, StrPtr, ObjPtr. These functions are not supported by Microsoft Technical Support. They are not documented in the Visual Basic documentation and are provided in this Knowledge Base article "as is". Microsoft does not guarantee that they will be available in future releases of Visual Basic. Performing calls to RAPI functions from Visual Basic can be somewhat complicated. RAPI functions are UNICODE, and Visual Basic automatically converts strings from UNICODE to ANSI when you call API functions. To prevent Visual Basic from doing the conversion, you must use the StrPtr function to get the address of the UNICODE string buffer and pass it to the RAPI functions. The following example illustrates this process: 1. Create a new Standard EXE project in Visual Basic. 2. Place a command button on Form1. 3. Paste the following code into Form1's code module: 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 4. From the Project menu, click Add Module to add a .bas module to the project. 5. Paste the following code into Module1: Option Explicit Public Const HKEY_CLASSES_ROOT = &H80000000 Public Const HKEY_CURRENT_USER = &H80000001 Public Const HKEY_LOCAL_MACHINE = &H80000002 Public Const ERROR_SUCCESS = 0 Public Const REG_DWORD = 4 Public Const REG_SZ = 1 Type RAPIINIT cbsize As Long heRapiInit As Long hrRapiInit As Long End Type Public Declare Function CeRapiUninit Lib "rapi.dll" () As Long Public Declare Function CeRapiInitEx Lib "rapi.dll" ( _ pRapiInit As RAPIINIT) As Long Public Declare Function CeRegCreateKeyEx Lib "rapi.dll" ( _ ByVal hKey As Long, _ ByVal lpSubKey As Long, _ ByVal Reserved As Long, _ ByVal lpclass As Long, _ ByVal dwOptions As Long, _ ByVal samDesired As Long, _ ByVal lpSecurityAttributes As Long, _ phkResult As Long, _ lpdwdisposition As Long) As Long Public Declare Function CeRegOpenKeyEx Lib "rapi.dll" ( _ ByVal hKey As Long, _ ByVal lpSubKey As Long, _ ByVal ulOptions As Long, _ ByVal samDesired As Long, _ phkResult As Long) As Long Public Declare Function CeRegQueryValueEx Lib "rapi.dll" ( _ ByVal hKey As Long, _ ByVal lpValueName As Long, _ ByVal lpReserved As Long, _ lpType As Long, _ ByVal lpData As Long, _ lpcbData As Long) As Long Public Declare Function CeRegSetValueEx Lib "rapi.dll" ( _ ByVal hKey As Long, _ ByVal lpValueName As Long, _ ByVal Reserved As Long, _ ByVal dwType As Long, _ ByVal lpData As Long, _ ByVal cbData As Long) As Long Public Declare Function CeRegDeleteKey Lib "rapi.dll" ( _ ByVal hKey As Long, _ ByVal lpSubKey As Long) As Long Public Declare Function CeRegCloseKey Lib "rapi.dll" ( _ ByVal hKey As Long) As Long ' 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 ' Uninitialize RAPI Public Function DisconnectRapi() As Long Dim lcon As Long lcon = CeRapiUninit DisconnectRapi = lcon End Function 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 6. Make sure the connection between the device and the desktop is working. You must also have a partnership established. 7. Run the project, and then click Command1. 8. Use the Remote Registry Editor that is included with Microsoft Embedded Visual Tools 3.0 (or included with the Windows CE Toolkit for Visual Basic 6.0 if the target device is running Windows CE 2.0) to view the registry on the device and verify that the registry key was created. REFERENCES ========== For additional information, click the article number below to view the article in the Microsoft Knowledge Base: Q249144 HOWTO: Identify the CE Device Connected to the Desktop Machine Additional query words: rapi registry remote ce device ====================================================================== Keywords : kbDSupport Technology : kbVBSearch kbAudDeveloper kbOSWinCE kbZNotKeyword6 kbZNotKeyword2 kbVB600Search kbVB600 kbWinCESearch kbWinCE200 kbWinCE211 kbWinCE300 Version : :2.0,2.11,3.0,6.0 Issue type : kbhowto ============================================================================= THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY. Copyright Microsoft Corporation 2001.