Registry Scripting

本文介绍了一个用于修改Windows注册表的脚本工具RegistryScripting,并提供了一段C++代码示例,展示如何通过COM接口调用RegistryScripting进行注册表操作。
什么是Registry Scripting可以看一下的url, 简单的说就是一个往注册表里面写数据的脚本

http://msdn2.microsoft.com/en-us/library/k32htktc(VS.80).aspx

上面是Registry Scripting的使用,我们如何能够调用Registry Script呢。下面是我的代码,运行当前目录下的一个ATestAddin.rgs的注册脚本文件

int  _tmain( int  argc, _TCHAR *  argv[]) {
    ::CoInitialize(NULL);
    
//the registry Interface
    CComPtr<IRegistrar> spIReg;
    HRESULT hr 
= ::CoCreateInstance(
        CLSID_Registrar,
        NULL,
        CLSCTX_INPROC_SERVER,
        IID_IRegistrar,
        (
void**)&spIReg);
    assert(SUCCEEDED(hr));
    
const DWORD PATH_LENGTH = 1024;
    
//Get the currently path
    LPWSTR currentLocation = new WCHAR[PATH_LENGTH];
    ::GetCurrentDirectoryW(PATH_LENGTH,currentLocation);
    ::StrCatW(currentLocation, L
"/TestAddin.dll");
    
//currentDirectory contain a 
    hr = spIReg->AddReplacement(L"MODULE",currentLocation);
    assert(SUCCEEDED(hr));
    hr 
= spIReg->FileRegister(L"ATestAddIn.rgs");
    assert(SUCCEEDED(hr));
    spIReg.Release();
    ::CoUninitialize();

    delete[] currentLocation;
    
return 0;
}

 

其中主要是用到了com接口IID_IRegistrar

其中AddReplacement是吧registry中的定义的一些(变量用%xxx%表示)替换为某一个字符串

### Inno Setup 无法写入注册表解决方案 当遇到 Inno Setup 无法写入注册表的情况时,可能的原因包括权限不足、路径错误或配置不当等问题。以下是详细的排查和解决方法: #### 权限设置 确保脚本具有足够的权限来修改目标位置的注册表条目。通常情况下,在 Windows 中操作注册表需要管理员权限。 对于某些特定情况下的权限处理可以参照如下说明[^3]: - 如果 `ValueType` 是 `none` 并且使用了 `deletekey` 或者 `deletevalue` 标记,则不需要额外设定权限。 ```ini [Registry] Root: HKLM; Subkey: "SOFTWARE\MyCompany"; ValueType: string; ValueName: "InstallPath"; ValueData: "{app}"; Flags: uninsdeletekeyifempty ``` #### 验证路径准确性 确认 `[Registry]` 节中的每一项参数都正确无误,特别是根键 (`Root`) 和子键 (`Subkey`) 的拼写以及它们之间的层次关系要准确匹配实际需求。 例如下面这段代码展示了如何向用户的当前用户配置单元下创建一个新的注册表入口并赋予其初始值[^4]: ```ini [Registry] Root: HKCU; Subkey: "Software\MyApp"; ValueType: string; ValueName: "Version"; ValueData: "1.0" ``` #### 使用正确的函数调用方式 如果是通过 Pascal Scripting 进行动态注册表操作的话,请注意采用合适的 API 函数来进行读取/写入动作。比如利用内置过程 `RegWriteStringValue()` 可以方便地完成字符串类型的注册表数据录入工作[^1]. ```pascal procedure CurStepChanged(CurStep: Integer); begin if CurStep=ssPostInstall then begin RegWriteStringValue(HKEY_CURRENT_USER, 'Software\MyApp', 'InstalledDate', FormatDateTime('yyyy-mm-dd', Now)); end; end; ``` #### 清理残留信息的影响 有时旧版本软件留下的未完全清除的数据可能会干扰新安装包的行为模式。因此建议先尝试运行一次完整的卸载流程再重新部署新的应用程序实例,以此减少潜在冲突的可能性[^2].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值