Avatar billede nubi19 Nybegynder
07. august 2002 - 01:20 Der er 24 kommentarer og
1 løsning

Tilføj til registreringsdatabase / tilføj genvej til startmenu

Ved ikke hvilken løsning der er nemmest, men mit program skal, når det køres første gang (det opretter en fil efter første kørsel, og hvis det ikke kan finde filen, ved jeg jo så det er første kørsel) oprette enten en genvej i startmenuen -> Programmer -> Start
ELLER tilføje sig selv i registreringsdatabasen, under windows -> Run (ms og en helt masse andet inden windows).
Men hvad er nemmest og hvordan gør man ?

Ps. Beklager at jeg ikke har flere point.
Avatar billede nico26 Nybegynder
07. august 2002 - 02:01 #1
her du kan læse noget om, hvordan man får adgang til regdb med c++

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnppc2k/html/ppc_stry.asp
Avatar billede jpk Nybegynder
07. august 2002 - 09:10 #2
Man benytter typisk et program som InstallShield til at kopiere programfiler over, samt at registrere dll'er. Et sådant program kan ligeledes lave de tilføjelser til Startmenuen og de genveje du ønsker og så er det let..!
Du skal tænke på, at der kan være forskel i fremgangsmåden hvorpå det gøres, i forskellige versionr af et operativsystem. Det tager et sådant program også højde for...
InstallShield følger fx med Visual Studio...
Avatar billede nubi19 Nybegynder
07. august 2002 - 09:57 #3
Hmmm tror ikke installshield fulgte med mit borland c++ builder 4.0 (er ret overbevist faktisk), øv :(
Men du har da ret i at der er forskel på at køre win 95 & win XP.
Avatar billede kamikaze Nybegynder
08. august 2002 - 11:38 #4
Hvis du bare vil skrive til registry:

HKEY hkey = NULL;
    char szKey[1024];
    DWORD dwDisp;
    DWORD dwErr;

    //*** GET_CHANNEL
    strcpy(szKey, "SYSTEM\\CurrentControlSet\\Services\\");
    strcat(szKey, m_szServiceName);
    strcat(szKey, "\\GET_CHANNEL");
    dwErr = RegCreateKeyEx(HKEY_LOCAL_MACHINE,
                          szKey,
                          0,
                          "",
                          REG_OPTION_NON_VOLATILE,
                          KEY_WRITE,
                          NULL,
                          &hkey,
                          &dwDisp);
    if (dwErr != ERROR_SUCCESS) return false;

    RegSetValueEx(hkey,
                  "GET_CHANNEL",
                  0,
                  REG_DWORD,
                  (BYTE*)&GET_CHANNEL,
                  sizeof(GET_CHANNEL));
    RegCloseKey(hkey);
Avatar billede kamikaze Nybegynder
08. august 2002 - 11:41 #5
Ovenstående opretter en nøgle:
HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\GET_CHANNEL

og sætter værdien af denne nøgle til indholdet af en variabel: char GET_CHANNEL[1024];
Avatar billede nubi19 Nybegynder
08. august 2002 - 11:46 #6
Imponerende, men øh hvad nu hvis nøglen allerede findes ?
Avatar billede kamikaze Nybegynder
08. august 2002 - 17:13 #7
Ja, så er der jo ingen grund til at oprette den (selv om det nu ikke gør noget at prøve igen!!!). Så kan du nøjes med flg.:

1. Åbn nøglen
2. Sæt værdien
3. Luk nøglen.

Du åbner den med flg. kald:

LONG RegOpenKey(
  HKEY hKey,        // handle to open key
  LPCTSTR lpSubKey, // address of name of subkey to open
  PHKEY phkResult  // address of handle to open key
);

sætter med flg:

LONG RegSetValue(
  HKEY hKey,        // handle to key to set value for
  LPCTSTR lpSubKey,  // address of subkey name
  DWORD dwType,      // type of value
  LPCTSTR lpData,    // address of value data
  DWORD cbData      // size of value data
);

og lukker med:

LONG RegCloseKey(
  HKEY hKey  // handle to key to close
);
Avatar billede nubi19 Nybegynder
08. august 2002 - 20:37 #8
Ehm nøglen existerer ikke, det var bare om der skete noget ved at den måske evt. gjorde.
Tjekker det lige imorgen, da jeg ikke har ret meget tid idag.
Avatar billede nubi19 Nybegynder
09. august 2002 - 00:01 #9
har lige prøvet og får de her fejl:
[C++ Error] Unit1.cpp(25): E2451 Undefined symbol 'm_szServiceName'.
[C++ Error] Unit1.cpp(36): E2467 '_fastcall TForm1::Button1Click(TObject *)' cannot return a value.
[C++ Error] Unit1.cpp(42): E2451 Undefined symbol 'GET_CHANNEL'.
[C++ Error] Unit1.cpp(43): E2109 Not an allowed type.

l 25:    strcat(szKey, m_szServiceName);
l 36:    if (dwErr != ERROR_SUCCESS) return false;
l 42:                  (BYTE*)&GET_CHANNEL,
l 43:                  sizeof(GET_CHANNEL));
Avatar billede kamikaze Nybegynder
10. august 2002 - 10:47 #10
Det er klart - du kører CBuilder kan jeg se, koden jeg postede er til MSVC++ :o) Men det er nu ret nemt at porte, det er de samme API-kald.

Du skal selvfølgelig selv sætte andre værdier ind i kaldene. m_szServiceName, GET_CHANNEL osv. er nogle variable fra mit program, dem har du ikke....
Avatar billede kamikaze Nybegynder
10. august 2002 - 10:50 #11
Altså inden i Button1Click kan du gøre flg.:

HKEY hKey;
char szKey[1024];
strcpy (szKey, "SYSTEM\\CurrentControlSet\\Services\\");
RegOpenKey(HKEY_LOCAL_MACHINE, szKey, hKey);
// hKey peger nu på nøglen...
Avatar billede kamikaze Nybegynder
10. august 2002 - 10:52 #12
På samme måde kan du læse/skrive værdien af nøglen og lukke den igen....
Avatar billede nubi19 Nybegynder
10. august 2002 - 13:44 #13
Hmmm jeg prøver lige at kigge lidt på det.
Avatar billede kamikaze Nybegynder
16. august 2002 - 08:56 #14
Er du kommet videre?!?
Avatar billede nubi19 Nybegynder
16. august 2002 - 17:31 #15
Faktisk ikke, for 5 dage siden brændte jeg mobo, cpu & RAM af, og har først nu fået det op at køre igen. Men med lidt held får jeg det tjekket i aften (har kun lige fået windows installeret igen, og mangler stadigvæk meget....)
Avatar billede nubi19 Nybegynder
16. august 2002 - 20:48 #16
Hmmm er kommet videre, det jeg skal er at tilføje en REG_SZ value. Men hvis jeg bruger GET_CHANNEL som buffer for det der skal skrives til key'en, og så gør:
char *GET_CHANNEL;
Så kan den kun være på 4 tegn ?
Hvis jeg så istedet gør:
char GET_CHANNEL[1024]; så kan den godt være lang, men der kommer følgende warning:
[C++ Warning] Unit1.cpp(38): W8079 Mixing pointers to different 'char' types.

Så hvad gør jeg ?
Avatar billede nubi19 Nybegynder
16. august 2002 - 20:51 #17
Og btw. nu jeg har dig, hvordan finder jeg nemmest den fulde sti inkl eller excl .exe filens navn ? (Idet jeg skal tilføje den til hkey_local_machine\microsoft\windows\current version\run)
Avatar billede nubi19 Nybegynder
17. august 2002 - 14:38 #18
Nå men nu virker det, det var da rart :)
Avatar billede nubi19 Nybegynder
17. august 2002 - 18:02 #19
Hov vent jeg har stadigvæk ikke fundet ud af det med *GET_CHANNEL vs. GET_CHANNEL[1024]
Hvilken skal jeg bruge ?
Avatar billede kamikaze Nybegynder
17. august 2002 - 21:01 #20
Du skal enten bruge char GET_CHANNEL[1024] (ell. evt. kortere end 1024), eller du skal selv allokere plads:
char* MyPointer;
MyPointer = new char[1024];
Avatar billede nubi19 Nybegynder
17. august 2002 - 22:17 #21
jeg vil lige forsøge den sidstnævnte metode, synes heller ikke det kunne være rigtigt at jeg ikke skulle allokere plads i pointeren, men vidste ikke hvordan :D
Avatar billede kamikaze Nybegynder
17. august 2002 - 22:37 #22
:o)
Avatar billede nubi19 Nybegynder
18. august 2002 - 00:07 #23
Hmm den nosser stadigvæk i det.
Hvis jeg bruger den der med char* og derefter new char, så ender jeg med samme resultat som mypointer[1024]
Og resultatet er at den key der bliver oprettet kommer til at hedde mypointer... (altså 3 punktummer)
Hvis jeg bruger *mypointer, så bliver teksten kun 4 tegn lang.

ØV det duer ikke :(
Avatar billede nubi19 Nybegynder
18. august 2002 - 00:09 #24
Problemet er fundet, men ikke løst. SizeOf(ValueBuffer) når *ValueBuffer bruges, nosser simpelthen i det og returnerer 4.
Avatar billede nubi19 Nybegynder
18. august 2002 - 00:20 #25
Hmmm hvordan får jeg så længden af min ValueBuffer* ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester