Alterar propriedades no regedit C++

Bom galera é o seguinte to precisando alterar uma propriedade no regedit do Windows com C++,
mais a propriedade e do tipo REG_BINARY alguém pode me ajudar como eu consigo alterar
esse tipo de dados.
Obs: os tipos REG_SZ e REG_DWORD eu consigo alterar normalmente.


Passe um BYTE* no campo lpData.

[quote=entanglement]http://msdn.microsoft.com/en-us/library/windows/desktop/ms724923(v=vs.85).aspx
Passe um BYTE* no campo lpData. [/quote]

Bom dia entanglement eu estava me baseando neste código que vc mesmo postou aki no GUJ Alterar Wallpaper,
mais como que coloquei no primeiro post a propriedade e do tipo REG_BINARY e uma propriedade do seu valor e verdadeiro ou false se eu acessar o Regedit a minha propriedade habilitada tem valor 01 desabilitada 00.
Se eu passar o valor 1 no formato BYTE* no meu registro ela vira 31 e se for passado o 0 ela vira 30.
Esta é a minha grande dúvida como eu faço pra colocar os respectivos valores 01 e 00 em uma propriedade REG_BINARY.?

Obs: pra colocar 00 se eu passar o BYTE* vazio ou seja NULL ele vai normal… no meu registro fica 00 (valor correto e esperado.)

Dúvida: o meu valor 01 como eu adiciono ele.?

Só uma coisinha. Você poderia me dizer exatamente o que deve ser passado nesse REG_BINARY?

Usualmente, quando se deve passar uma propriedade booleana no RegEdit, você precisa passar (por exemplo) 1 ou 4 bytes.

No primeiro caso, você tem de passar um byte array mais ou menos assim:

BYTE[] bytes = {1}; // se for para passar "01"
BYTE[] bytes = {0}; // se for para passar "00"

e no parâmetro de comprimento, teria de passar 1.

No segundo caso, que não é raro, na verdade você teria de passar um DWORD, mais ou menos assim:

DWORD dword = 1; // se for para passar "01 00 00 00"
DWORD dword = 0; // se for para passar "00 00 00 00"

e no parâmetro de comprimento, passar sizeof (DWORD) ou seja, 4.
Obviamente você teria de fazer o cast do dword, mais ou menos como:

(BYTE*) &dword

entanglement muito obrigado pela sua resposta funcionou direitinho! :smiley:
Bom mais tipow… eu atualizei no regedit mais não mudou como o esperado…
Ex: Essa propriedade que eu quero mudar se chama printKeepPrintedJobs essa propriedade define se
uma impressora deve ou não manter os trabalhos de impressão após serem impressos.
Eu mudei no meu regedit como deveria ficar… mais quando eu vou ver as configurações da impressora
essa propriedade continua desmarca ou seja não manter os trabalhos impressos.
Dúvida: eu deve fazer mais alguma coisa pra atualizar tais configuração.?

Boa pergunta, olhando na Internet eu vi que isso parece que funciona ou não. Será que é necessário reiniciar o serviço Spooler para isso funcionar direito?

Bom mediante os teste que eu fiz… só funciona se eu reiniciar a máquina, se reiniciar só o spool não acontece nada…
Será se não existe uma forma de reiniciar essas configurações via programação C++?
Porque pelo que eu andei lendo, essa alteração esta ligada ao driver da impressora dai somente quando se reinicia a máquina
ela lê as novas configurações do regedit.

Xi, se é o driver, então você teria de contactar o fabricante, para ver se há alguma coisa não-documentada que sirva para forçar o driver a reler a entrada do registry. Como provavelmente você não vai ter uma resposta rápida para isso, talvez você acabe forçando a reiniciar a máquina :frowning:

entanglement como eu não achei uma solução elegante e rápida… eu resolvi fazer este procedimento
da seguinte modo.
To executando um arquivo VBS Prncnfg.vbs que serve pra gerenciar impressoras, e ele tem as flags +keepprintedjobs(manter os jobs após ser impresso) e -keepprintedjobs(pra apagar após ser impresso)
enfim enquanto não surgi uma solução mais elegante to continuarei a fazer neste modelo…
Se encontrar alguma solução eu post aki…

Vlw, pelas dicas.

Legal. Se você não quiser depender do prnconfig.vbs, pode tentar reproduzir o que está escrito nesse programa VBScript usando alguma biblioteca como o Jacob - deve dar bastante trabalho, afinal de contas esse VBS é bem grandinho mesmo, e fica um pouco difícil separar só a parte que interessa.

Entretanto, eu recomendaria a continuar usar o vbs, porque pode ser que o Jacob acabe gerando algum erro de JNI quando for chamar as APIs de WMI, o que não é uma perspectiva muito agradável. Chamando o VBS, você limita os danos ao programa VBS, que provavelmente não deverá ter nenhum problema ao chamar as APIs de WMI.

Seguinte, eu não uso frequentemente alterar o resgitro do windows, mas da última vez que precisei descobri que isso deve ser feito pela registry api. A partir do win vista foram criados uma série de mecanismos de proteção para o registro do windows.

Qualquer software que tente alterar o registro não tenha a assimatura necessária é encarado como malware.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms724871(v=vs.85).aspx

E de qualquer maneira o Registry é apenas um banco de dados gigante de configuração, e ainda por cima hierárquico (não relacional).
Se o aplicativo (como no caso o driver de impressora) não lê a toda hora o registry para pegar a configuração mais corrente, nem adianta mexer diretamente no Registry. Nesse caso, deve-se usar algo como WMI para realmente avisar ao driver (ou outro componente do Windows) que desejamos alterar a configuração, sem ficar mexendo diretamente em alguma entrada do Registry não-documentada oficialmente, e que pode mudar de versão para versão do Windows.