[ Duke Nukem @ 19.12.2004. 22:59 ] @
Da li neko zna zasto ovo parce koda ( kompajlovao BC++ Buileder 1 ) nece da otvori novi kljuc u registry i upise string

String temp = "test";
try
{
reg= new TRegistry;

reg->CreateKey("\\HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce\\Test");
if (reg->OpenKey("\\Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce\\Test", true))
{
reg->WriteString("Test", temp);
reg->CloseKey();
}
}
catch(...)
{
Application->MessageBox("Problemi sa registry", "Naslov", IDIGNORE);
}
delete reg;

// predpostavljam da je problem trivijalan
// Hvala unapred
[ reiser @ 19.12.2004. 23:08 ] @
Verovatno lupam, ali zar CreateKey() vec ne vraca handle do key-a koji kreiras, tako da ti je pozivanje OpenKey() bespotrebno ??
[ MilošV @ 20.12.2004. 10:24 ] @
Sad, ne znam da li si pisao kod ponovo ili paste-ovao ovdje, ali ovo mi prvo pada u oci:
Code:
reg= new TRegistry;

Treba da stoji:
Code:
TRegistry *reg=new TRegistry;

Dalje, za novi TRegistry objekat, default je HKCU tj. moras pozvati i ovo:
Code:
reg->RootKey=HKEY_LOCAL_MACHINE;

nakon toga mozes da izbacis CreateKey tj. dovoljno je da stavis:
Code:
if(reg->OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce\\Test", true))
{
...
}

i ovo 'true' ce ti "zavrsiti posao" tj. ako kljuc ne postoji, kreirace ga...

Na kraju, provjeri da ti nije kreirao kljuc:
HKEY_CURRENT_USER\HKEY_LOCAL_MACHINE\Software\... ;) :)
[ Duke Nukem @ 20.12.2004. 22:38 ] @
Hvala svima
napomena reg je vec bio deklarisan kao pointer u globalnim prom.
Probao sam Milosev nacin pre nego sto zam zapoceo temu, izgleda da je problem u registry --> RunOnce folderu. Jos uvek ga nisam provalio, ali izgleda da windows nakon startovanja brise sve vrednosti iz njega, tako da ga ne mozemo videti kada startujemo regedit.
Pozdrav svim ljubiteljima Borland C++ kompajlera.
[ Duke Nukem @ 21.12.2004. 22:10 ] @
>
>
>
Postovani
Hvala ti na sugestijama, nakon izvesnog eksperimentisanja doneo sam
sledece zakljucke (Windows XP )
1. Problem je kljuc HKCUHKEY_LOCAL_MACHINESoftware...,
umesto njega treba pisati u kljuc Reg->RootKey = HKEY_CURRENT_USER;
i problema nema! Naime pravio sam aplikaciju koja se sama startuje ako
je bila iskljucena metodom nestanka struje napr.
2. Reg je definasan ranije kao pokazivac u globalu, a deo koda prikazan
na konferenciji je pastovan kao sto si dobro primetio.
Sada sve to lepo radi a kompletnu funkciju ti saljem pa mozes da je
nekada upotrebis

void TfrmMain::SetRegistry(int value)
{
TRegistry *Reg = new TRegistry;
try
{
Reg->RootKey = HKEY_CURRENT_USER;
if
(Reg->OpenKey("\Software\Microsoft\Windows\CurrentVersion\RunOnce",
true))
{
Reg->WriteString("MyPcProgram",""" + ParamStr(0) + """);
Reg->WriteInteger("Tip",value);
Reg->CloseKey();
}
}
catch(...)
{
//
}
delete Reg;
}

hvala : -)
[ NastyBoy @ 21.12.2004. 23:18 ] @
Citat:
Probao sam Milosev nacin pre nego sto zam zapoceo temu, izgleda da je problem u registry --> RunOnce folderu. Jos uvek ga nisam provalio, ali izgleda da windows nakon startovanja brise sve vrednosti iz njega, tako da ga ne mozemo videti kada startujemo regedit.


Bash tako. "RunOnce" tome i sluzhi, da se uskladishte privremeni programi koje treba startovati samo jednom pri butovanju Windows-a i nikad vishe (korisno za instalacione programe, na primer)
Ako zhelish da se tvoj program startuje uvek sa Windows-om, napravi kljuch u "Run" grani.
[ MilošV @ 22.12.2004. 07:22 ] @
Hvala :)
BTW, primjer koji sluzi upravo tome sto tebi treba (iz bcb help-a):
The following example shows how to tell Windows to relaunch your application when Windows starts up if it was running when the system shut down.
When Windows starts up, it launches each application listed in the RunOnce key and then deletes the entry for that application. Therefore, you do not need to remove the entry written here.
Code:

void __fastcall TForm1::WMEndSession(TWMEndSession &Message)
{
  TRegistry *Reg = new TRegistry;
  try
  {
    Reg->RootKey = HKEY_CURRENT_USER;
    if (Reg->OpenKey("\\Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce", true)
    {
      Reg->WriteString("MyApp","\"" + ParamStr(0) + "\"");
      Reg->CloseKey();
    }
  }
  __finally
  {
    delete Reg;
    TForm::WMEndSession(Message);

  }
}

In order for this method to be called, it must be declared in your main form class as follows:
Code:

class PACKAGE TForm1 : public TForm

{
  ...
protected:

BEGIN_MESSAGE_MAP
  MESSAGE_HANDLER(WM_ENDSESSION, TWMEndSession, WMEndSession)
END_MESSAGE_MAP(TForm)
};