Win CE 下 VB NET 注册表 修改

Maarten Struys
PTS Software
July 2003

Introduction

With the availability of the OpenNETCF.Registry library it is very easy to access the Windows CE registry. The functionality provided in the Registry library allows you to access the system registry similar to the way this is done in the full .NET Framework using the RegistryKey class of the Microsoft.Win32 namespace. The names of the classes and methods of the OpenNETCF Registry library are identical to those of the full .NET Framework and the functionality also closely resembles that of the .NET Framework. Using a very simple application we demonstrate how to create or open a registry key and how to store and retrieve values of the specified registry key.

OpenNETCF Registry Library functionality

To classes of the OpenNETCF.Registry Library are defined inside the OpenNETCF.Win32 namespace. They match the Microsoft.Win32 namespace on the full .NET Framework. The classes inside the OpenNETCF.Win32 namespace manipulate the system registry. Two different classes are available: Registry and RegistryKey . The Registry class contains the set of standard root keys that can be found in the Windows CE registry. This class exposes the following root registry keys:

  • CurrentUser - Used to store user preferences
  • LocalMachine - Used to store configuration information for the local machine
  • ClassesRoot - Used to store information about types (classes) and their properties
  • Users - Used to store information about the default user configuration

    The Registry class contains a number of static methods,each returning a RegistryKey instance to one of the four root keys.

    The RegistryKey class represents a key node in the Windows CE registry. To open or create a particular key node you have to call a member function of a valid instance of the RegistryKey class. That is where the static member functions of the Registry come in. Let's suppose we want to create a new registry key under the LocalMachine root key. The following code snippet will do so if the registry key does not yet exist,otherwise it simply opens the existing registry key: // Create / Open a registry key to store / retrieve values or to open / create other keys.
    const string keyName = "Software//OpenNETCFDemo//LastInvoked";
    RegistryKey registryKey = Win32.Registry.LocalMachine.CreateSubKey(keyName);

    Once we have a valid instance of a RegistryKey class we can use it to create or open new keys under the currently opened registry key. You can compare this to creating or accessing nodes in a tree under a particular root. We can also set values or retrieve values that are stored under the specified registry key. It is possible to delete keys and values. Finally it is also possible to get a list of all keys or values that are stored under the currently opened registry key.

    A simple demo application

    Suppose we want to show the date and time an application was last started when starting an application. To store and retrieve this kind of information,the registry is an ideal placeholder. For demonstration purposes we build a small SDA Forms application that shows the previous date and time the application was started in a static control. Using such a simple scenario we have a little code overhead as possible and we can just concentrate on accessing the registry database. The downloadable source code is targeted for a PocketPC 2003 emulator,but the same code can easily be executed on any Windows CE device that has the .NET Compact Framework installed.

    First we create a new smart device application. In the form designer,add an empty label control and rename this to lblInvocationTime . This will be the placeholder to display the last invocation time that we are going to read from the system registry.

    Note that we modified the title of the form,using the Form properties and that we allow the application to close instead of to minimize it. This can be achieved by setting the Form's MinimizeBox property to False.

    To obtain the date and time the application was started previously we maintain a system registry value under the following key:

    /LocalMachine/Software/OpenNETCFSample/LastInvoked

    The value that we store under this key is called TimeStamp . It present it will hold a string containing the last date and time the application was started in the following format: dd-m-yyyy - hh:mm . We use exactly the value read from the registry database to inform the user about the last invocation time of the application.

    Before you can make use of the OpenNETCF Registry Library it is necessary to add a reference to the component assembly containing the library. To do so right click References in the solution explorer view of Visual Studio and add the Registry Library DLL. Registry and RegistryKey can be found in the OpenNETCF.Win32 namespace.

    To be able to access the system registry we define a private member variable of type RegistryKey in the Form class. Because we want to show the last invocation time immediately when the form is displayed,we add the functionality to access the system registry in the Form1_Load event. This event is fired when the form is loaded. The following code snippet shows the Form1_Load event handler:

    private void Form1_Load(object sender,System.EventArgs e)
    {
    const string keyName = "Software//OpenNETCFSample//LastInvoked";
    const string valueName = "TimeStamp";
    string accessTime;

    // Create / Open a registry key to store / retrieve last application start time.
    registryKey = Win32.Registry.LocalMachine.CreateSubKey(keyName);

    if (registryKey.ValueCount == 0)
    {
    // No value available in the created / opened subkey
    lblInvocationTime.Text = "Unknown";
    }
    else
    {
    // Since we use this key exclusively for this application,we can safely
    // assume that the value we are interested in is available in the registry.
    // GetValue reads the registry value and returns it to the caller.
    accessTime = (string)registryKey.GetValue(valueName);
    lblInvocationTime.Text = accessTime;
    }

    // Since we now know for sure we have a open registry key,let's store the current
    // time in it,to be able to retrieve it the next time we start the application.
    accessTime = DateTime.Now.ToShortDateString() + " - " + DateTime.Now.ToShortTimeString();
    registryKey.SetValue(valueName,accessTime);

    // Make sure to close the open registryKey. Since the RegistryKey class P/Invokes
    // to Win32 API's,a handle to a registry key remains open if we not explicitely
    // close it,even if our RegistryKey instance gets out of scope and gets GC'd.
    registryKey.Close();
    }

    To access the registry we use a constant string containing keyName and a constant string containing the valueName . When the specified key does not exist,CreateSubKey creates the key in the system registry under the specified root key,LocalMachine in this case. When the specified key already exists,CreateSubKey simply opens that key to be able to access sub keys or values.

    The RegistryKey class contains a ValueCount property that returns the number of values that exist under the open sub key. When ValueCount equals 0,no values are found under the sub key. In our sample this means that the application is activated for the very first time.

    If ValueCount unequals 0,a value is available. Since we maintain the registry key exclusively we assume that the value we are looking for is available in this case.

    Using GetValue we simply retrieve the registry value. Since GetValue returns an Object we have to cast it to a string,because our stored value is of type string .

    We now can simply assign the retrieved value to the Text property of lblInvocationTime . After retrieving the registry value we store the current date and time back into the system registry for the next time the application is invoked.

    SetValue uses the valueName to create a new value or to overwrite an existing value. This is all there is to store data in the system registry and to retrieve data from the system registry.

    To keep the sample code simple we have ignored the fact that RegistryKey members can throw exceptions. A "real" application might want to catch those exceptions to gracefully exit or to recover from failures. Special attention is needed to properly close open registry keys.

    Every time an instance of RegistryKey opens or creates a registry key,an underlying Win32 API is called that returns a handle to the specified registry key. Even though we don't have to worry about cleaning up resources in managed code,we have to take care of cleaning up resources in unmanaged code. That is the reason why we explicitly need to call the Close member function of the RegistryKey class.

    There is one exception to this. Even though it is possible in code,you should not close the four available root keys that are defined as static members in the Registry class,inside an application. After closing them it is not possible to re-open the root keys again without restarting the application.

    Conclusion

    Using the OpenNETCF Registry Library you get full access to the Windows CE system registry without the need to P/Invoke the Win32 registry API's. The functionality is similar to the functionality of the Registry classes of the full .NET Framework. As the sample code showed,accessing the system registry is fairly easy and straight forward.

    Sample code

    Sample code for this article can be downloaded here .

  • 版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

    相关推荐


    Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强制返回为文本 -------------------------------- 数字类型的格式化 --------------------------------     固定格式参数:     General Number 普通数字,如可以用来去掉千位分隔号     format$("100,1
    VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和系统设置的区域语言的日期和时间格式相关。意思是尽管你用诸如 Format(Now, "MM/dd/yyyy"),如果系统的设置格式区域语言的日期和时间格式分隔符是"-",那他还会显示为 MM-dd-yyyy     只有拼凑: <%response.write
    在项目中添加如下代码:新建窗口来显示异常信息。 Namespace My ‘全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可 ‘添加后还需要一个From用来显示错误。如果到这步还不会则需要先打好基础啦 ‘======================================================== ‘以下事件
    转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀。 https://blog.csdn.net/chzjxgd/article/details/6176325 金蝶K3 BOS的插件官方是用VB6编写的,如果  能用.Net下的语言工具开发BOS插件是一件很愉快的事情,其中缘由不言而喻,而本文则是个人首创,实现在了用V
    Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integer, y As Integer, subStr As String If MsgBox("确定要分列处理吗?请确定分列的数据会覆盖它后面的单元格!", _
      窗体代码 1 Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) 2 Dim path As String, hash As String 3 For Each fil
      Imports MySql.Data.MySqlClient Public Class Form1 ‘ GLOBAL DECLARATIONS Dim conString As String = "Server=localhost;Database=net2;Uid=root;Pwd=123456;" Dim con As New MySqlConnection
    ‘導入命名空間 Imports ADODB Imports Microsoft.Office.Interop   Private Sub A1() Dim Sql As String Dim Cnn As New ADODB.Connection Dim Rs As New ADODB.Recordset Dim S As String   S = "Provider=OraOLEDB.Oracl
    Imports System.IO Imports System.Threading Imports System.Diagnostics Public Class Form1 Dim A(254) As String    Function ping(ByVal IP As Integer) As String Dim IPAddress As String IPAddress = "10.0.
    VB运行EXE程序,并等待其运行结束 参考:https://blog.csdn.net/useway/article/details/5494084 Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Pr
    今天碰到一个问题,登陆的时候,如果不需要验证手机号为空,则不去验证手机号 因为登陆的时候所有的验证信息都存放在一个数组里 Dim CheckUserInfo() As String ={UserBirthday, SecEmail, UserMob, UserSex, RealNameFirst, RealName, CheckCardID, CheckCardType, Contactemail
    在VB6.0中,数据访问接口有三种: 1、ActiveX数据对象(ADO) 2、远程数据对象(RDO) 3、数据访问对象(DAO) 1.使用ADO(ActiveX Data Objec,ActiveX数据对象)连接SQL Server 1)使用ADO控件连接 使用ADO控件的ConnectionString属性就可以连接SQL Server,该属性包含一个由分号分隔的argument=value语
    注:大家如果没有VB6.0的安装文件,可自行百度一下下载,一般文件大小在200M左右的均为完整版的软件,可以使用。   特别提示:安装此软件的时候最好退出360杀毒软件(包括360安全卫士,电脑管家等,如果电脑上有这些软件的话),因为现如今的360杀毒软件直接会对VB6.0软件误报,这样的话就可能会在安装过程中被误报阻止而导致安装失败,或者是安装后缺乏很多必须的组件(其它的杀毒软件或安全卫士之类的
    Private Sub Form_Load() Call conndb End Sub Private Function conndb() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strCn, sql As String Dim db_host As String Dim db_user As String
      PPSM06S70:  Add  moddate  EDITSPRINTJOB:  MAX(TO_CHAR(ETRN.MODDATE, ‘yyyy/mm/dd/HH24:MI AM‘)) ACTUAL_SHIPDATE   4.Test Scenario (1) :Query SQL Test DN:8016578337 SELECT CTRN.TKCTID TRUCK_ID,        
      沒有出現CrystalReportViewer時,須安裝CRforVS_13_0. 新增1個數據集,新增1個數據表,添加二列,列名要和資料庫名一樣. 修改目標Framework 修改app.config, <startup >改成<startup useLegacyV2RuntimeActivationPolicy ="true">  CrystalReport1.rpt增加數據庫專家 在表單
    Imports System.Threading Imports System Public Class Form1 Dim th1, th2 As Thread Public Sub Method1() Dim i As Integer For i = 1 To 100 If Me.Label1.BackColor =
    Friend Const PROCESS_ALL_ACCESS = &H1F0FFF = 2035711 Friend Const PROCESS_VM_READ = &H10 Friend Const PROCESS_VM_WRITE = &H20 Friend Const PAGE_READONLY = &H2 Friend Const PAGE_READWRITE = &H4 Friend
    以下代码随手写的 并没有大量测试 效率也有待提升 如果需要C#的请自行转换 Function SplitBytes(Data As Byte(), Delimiter As Byte()) As List(Of Byte()) Dim i = 0 Dim List As New List(Of Byte()) Dim bytes As New
    Imports System.Data.SqlClient Public Class Form1 REM Public conn1 As SqlConnection = New SqlConnection("server=.; Integrated Security=False;Initial Catalog= mydatabase1; User ID= sa;password")