.net Framework类库越来越丰富了。伴随vs2008已经3.5版本了。
以前写程序很少会去调用.net framework,不过随着微软的主推,和不断对其进行扩展。
其功能正在逐渐强大,使用更加简洁和方便。
这里通过对注册表的操作。我们来看看vc++.net程序。
说明:以下代码在vs2005下编译。
简单的说传统的c++如何调用net frame.
一些预备知识:
^:vc2005下,声明托管堆(the managed heap)上对象的句柄。
在vc++2002和vc++2003下,声明托管堆上对象的句柄是用“__gc *”表示。
为什么会出现"^"符号呢?
在netframe下,为了保持托管堆上的对象的引用能够被垃圾收集器跟踪,且当这个对象被移动的时候,这个句柄可以被及时的更新。而传统的指针和引用无法被正确跟踪,所以产生了^来表示一个托管堆上对象的句柄。
其可以用->来访问其成员。
什么时候用 ^ 呢?
来看看RegisterKey的声明
[ComVisibleAttribute(true)]
public ref class RegistryKey sealed : public MarshalByRefObject, IDisposable
看到ref了吧,
ref:声明一个托管类或者结构。
看到它,就声明^
以下三个例子应该很容易看懂了。
1. 将数据写入注册表
using namespace System;
using namespace Microsoft::Win32;
int main()
{
// The second OpenSubKey argument indicates that
// the subkey should be writable.
RegistryKey^ rk;
//托管堆上的一个句柄
rk = Registry::CurrentUser->OpenSubKey("Software", true);
//静态成员可以通过其类名直接访问
if (!rk)
{
Console::WriteLine("Failed to open CurrentUser/Software key");
return -1;
}
RegistryKey^ nk = rk->CreateSubKey("NewRegKey");
if (!nk)
{
Console::WriteLine("Failed to create 'NewRegKey'");
return -1;
}
String^ newValue = "NewValue";
try
{
nk->SetValue("NewKey", newValue);
nk->SetValue("NewKey2", 44);
}
catch (Exception^)
{
Console::WriteLine("Failed to set new values in 'NewRegKey'");
return -1;
}
Console::WriteLine("New key created.");
Console::Write("Use REGEDIT.EXE to verify ");
Console::WriteLine("'CURRENTUSER/Software/NewRegKey'\n");*/
return 0;
}
2. 从注册表中读取数据
using namespace System;
using namespace Microsoft::Win32;
int main( )
{
array<String^>^ key = Registry::CurrentUser->GetSubKeyNames( );
Console::WriteLine("Subkeys within CurrentUser root key:");
for (int i=0; i<key->Length; i++)
{
Console::WriteLine(" {0}", key[i]);
}
Console::WriteLine("Opening subkey 'Identities'...");
RegistryKey^ rk = nullptr;
rk = Registry::CurrentUser->OpenSubKey("Identities");
if (rk==nullptr)
{
Console::WriteLine("Registry key not found - aborting");
return -1;
}
Console::WriteLine("Key/value pairs within 'Identities' key:");
array<String^>^ name = rk->GetValueNames( );
for (int i=0; i<name->Length; i++)
{
String^ value = rk->GetValue(name[i])->ToString();
Console::WriteLine(" {0} = {1}", name[i], value);
}
return 0;
}
3. 从注册表中删除subkey.
RegistryKey^ rk;
rk = Registry::CurrentUser->OpenSubKey("Software", true);
if (!rk)
{
Console::WriteLine("Failed to open CurrentUser/Software key");
return -1;
}
rk->DeleteSubKey("NewRegKey");
写在后面的话:
之所有写这个标题,而不写有关CLI的,国内关于cli探讨还是比较少的。
既然,有人有好的建议,加一个副标题好了。