想通程序式修改注冊表,控制列印機的印刷設定。
先取出當前的設定值,修改后再放回去。
TRegistry *Reg;
Reg = new TRegistry(KEY_ALL_ACCESS);
Reg->RootKey = HKEY_CURRENT_USER;
Reg->OpenKey("Printers\\DevModePerUser",true);
Reg->GetDataType("wateress");
int BuffLength = Reg->GetDataSize("wateress");
unsigned char* Buff = new unsigned char[BuffLength+1];
Reg->ReadBinaryData("wateress", Buff, BuffLength);
AnsiString strHex;
for(int i=0;i<BuffLength;i++) {
strHex = strHex+" "+IntToHex(((int)Buff[i]),2);
}
// ↓↓↓修改設定值↓↓↓
strHex=.....
// ↑↑↑修改設定值↑↑↑
然后我想把上面修正的strHex在以同樣的型別放回去,請問應該怎么做?
Reg->WriteBinaryData("wateress", strHex, BuffLength);
請幫我看看!
uj5u.com熱心網友回復:
頂一下,第一次干C++就遇到這樣的問題!
uj5u.com熱心網友回復:
參考一下例子吧http://docwiki.embarcadero.com/CodeExamples/Seattle/en/JumpListTest_%28C%2B%2B%29
uj5u.com熱心網友回復:
Reg->WriteBinaryData("wateress", strHex.c_str(), BuffLength);
uj5u.com熱心網友回復:
Reg->WriteBinaryData("wateress", strHex.c_str(), strHex.Length());
uj5u.com熱心網友回復:
謝謝回復,
這個我當初就這么寫的,
結果不知為什么,注冊表的鍵值都被刪掉了。
后來我干脆什么都不更改,取出來后直接 strHex.c_str()讓回去,也是同樣的效果(注冊表的鍵值都被刪掉)。
不知什么原因。
uj5u.com熱心網友回復:
都沒有遇到過么?為毛我第一次干C++就遇到怎么棘手的問題。
uj5u.com熱心網友回復:
我測驗沒有洗掉啊,末尾加上了Reg->CloseKey();
delete Reg;
另外你的資料讀出寫入是有變化的。
void __fastcall TForm3::Button2Click(TObject *Sender)
{
TRegistry *Reg;
Reg = new TRegistry(KEY_ALL_ACCESS);
Reg->RootKey = HKEY_CURRENT_USER;
Reg->OpenKey("Printers\\DevModePerUser", true);
Reg->GetDataType("wateress");
int BuffLength = Reg->GetDataSize("wateress");
byte Buff[20];
Reg->ReadBinaryData("wateress", Buff, sizeof(Buff));
AnsiString strHex;
for (int i = 0; i < BuffLength; i++) {
strHex = strHex + " " + IntToHex(((int)Buff[i]), 2);
}
// ↓↓↓修改設定值↓↓↓
if (strHex.Length() == 0)
{
Buff[0] = 0x01;
Reg->WriteBinaryData("wateress", Buff, 1);
}
else
{
Reg->WriteBinaryData("wateress", strHex.c_str(), strHex.Length());
}
Reg->CloseKey();
delete Reg;
}
uj5u.com熱心網友回復:
謝謝回復。我也從新試驗了一遍。
原因肯能使我取出的和我存入的不同。
比如我,取出的是
{ " 01" }
經過下面的處理,再次存入不是{ " 01" },
變成
{ " 20 30 31" }。
請問這個責備么解決?
TRegistry *Reg;
Reg = new TRegistry(KEY_ALL_ACCESS);
Reg->RootKey = HKEY_CURRENT_USER;
Reg->OpenKey("Printers\\DevModePerUser",true);
Reg->GetDataType("wateress");
int BuffLength = Reg->GetDataSize("wateress");
//unsigned char* Buff = new unsigned char[BuffLength+1];
unsigned char* Buff = new unsigned char[BuffLength];
Reg->ReadBinaryData("wateress", Buff, BuffLength);
AnsiString strHex;
for(int i=0;i<BuffLength;i++) {
strHex = strHex+" "+IntToHex(((int)Buff[i]),2);
}
if (strHex.Length() == 0) {
Buff[0] = 0x01;
Reg->WriteBinaryData("wateress", Buff, 1);
} else {
Reg->WriteBinaryData("wateress", strHex.c_str(), strHex.Length());
}
Reg->CloseKey();
delete Reg;
uj5u.com熱心網友回復:
void __fastcall TForm3::Button2Click(TObject *Sender)
{
TRegistry *Reg;
Reg = new TRegistry(KEY_ALL_ACCESS);
Reg->RootKey = HKEY_CURRENT_USER;
Reg->OpenKey("Printers\\DevModePerUser", true);
Reg->GetDataType("wateress");
int BuffLength = Reg->GetDataSize("wateress");
byte Buff[20];
Reg->ReadBinaryData("wateress", Buff, sizeof(Buff));
// ↓↓↓修改設定值↓↓↓
if (BuffLength == 0)
{
Buff[0] = 0x01;
Reg->WriteBinaryData("wateress", Buff, 1);
}
else
{
Buff[0] = Buff[0] + 1;
Reg->WriteBinaryData("wateress", Buff, BuffLength);
}
Reg->CloseKey();
delete Reg;
}
uj5u.com熱心網友回復:
大神,
沒看懂啊!
是直接修改取出來的值,
而不是通過下面的先轉換→修改→再轉換,
是這個意思么?
for(int i=0;i<BuffLength;i++) {
strHex = strHex+" "+IntToHex(((int)Buff[i]),2);
}
uj5u.com熱心網友回復:
是的,不要轉換了,直接修改就可以了,你轉成字串還得再轉成二進制。嫌麻煩還不如直接用WriteString
uj5u.com熱心網友回復:
完了,直接改我還知道怎么改了。我是通過對比,印刷設定修改前后的值,才知道如何設定,
因為在regedit表單里看到的值和IntToHex轉化后的值一樣,我才知道怎么改。
作為新手,直接改我還很不會。

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/93024.html
標籤:基礎類
上一篇:函式引數傳遞問題。
