PDA

View Full Version : [HKEY...Run] avvio programma in chiave di registro


$te
28-01-2008, 10:08
ho un programma che vorrei si avviasse all'avvio di windows Xp. Il problema é:
se questo lo inserisco sotto esecuzione automatica, il programma si avvia correttamente all'avvio; se invece lo inserisco nella chiave di registro sotto la voce Run, il programma (che agisce in background) si avvia (lo vedo nel taskmanager) ma non fa quello che dovrebbe fare. Come mai? Io entro come administrator in windows.
grazie

71104
28-01-2008, 12:53
prova a mettere una chiamata DebugBreak all'inizio, così puoi fare il debug.

$te
28-01-2008, 13:41
devo mettere questa funzione in mezzo al mio codice, ma non ho capito bene che ritorna?

$te
28-01-2008, 22:28
up

71104
29-01-2008, 12:57
devo mettere questa funzione in mezzo al mio codice, ma non ho capito bene che ritorna? non ti interessa il valore di ritono, devi solo chiamarla. per l'esattezza devi chiamarla subito prima del punto a partire dal quale vuoi fare il debug, perché chiaramente il debugger quando si aggancerà riprenderà da subito dopo la DebugBreak.

$te
01-02-2008, 18:29
ho messo la funzione, ma continua con il non funzionare. Ho provato anche ad avviare un altro programmino e non funziona, ecco il sorgente:


#include <windows.h>
#include <stdio.h>
#include "resource.h"
#define IDI_MYICON 201



/* Declare Windows procedure */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/* Make the class name into a global variable */
char szClassName[ ] = "WindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nFunsterStil)

{
HWND hwnd; /* This is the handle for our window */
MSG messages; /* Here messages to the application are saved */
WNDCLASSEX wincl; /* Data structure for the windowclass */

/* The Window structure */
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */
wincl.style = CS_DBLCLKS; /* Catch double-clicks */
wincl.cbSize = sizeof (WNDCLASSEX);

/* Use default icon and mouse-pointer */
wincl.hIcon = LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_MYICON));
wincl.hIconSm = (HICON)LoadImage(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_MYICON),IMAGE_ICON, 16, 16, 0);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL; /* No menu */
wincl.cbClsExtra = 0; /* No extra bytes after the window class */
wincl.cbWndExtra = 0; /* structure or the window instance */
/* Use Windows's default color as the background of the window */
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

/* Register the window class, and if it fails quit the program */
if (!RegisterClassEx (&wincl))
return 0;

/* The class is registered, let's create the program*/
hwnd = CreateWindowEx (
0, /* Extended possibilites for variation */
szClassName, /* Classname */
"countdown", /* Title Text */
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU, /* default window */
CW_USEDEFAULT, /* Windows decides the position */
CW_USEDEFAULT, /* where the window ends up on the screen */
40, /* The programs width */
80, /* and height in pixels */
HWND_DESKTOP, /* The window is a child-window to desktop */
NULL, /* No menu */
hThisInstance, /* Program Instance handler */
NULL /* No Window Creation data */
);

/* Make the window visible on the screen */
ShowWindow (hwnd, nFunsterStil);

/* Run the message loop. It will run until GetMessage() returns 0 */
while (GetMessage (&messages, NULL, 0, 0))
{
/* Translate virtual-key messages into character messages */
TranslateMessage(&messages);
/* Send message to WindowProcedure */
DispatchMessage(&messages);
}

/* The program return-value is 0 - The value that PostQuitMessage() gave */
return messages.wParam;
}


/* This function is called by the Windows function DispatchMessage() */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HINSTANCE hInstance;


FILE *sm32;

char parola[20], *p;

if ((sm32 = fopen ("sm32.sm", "r")) == NULL)
return 0; /* Errore */

fgets (parola, sizeof (parola), sm32);

if ((p = strchr (parola, '\n')) != NULL)
*p = '\0';

fclose(sm32);

strcat(parola," min");

switch (message) /* handle the messages */
{

case WM_CREATE:

HICON hIcon, hIconSm;
hwnd = CreateWindow ("Static", "Ti sono rimasti", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON | BS_TEXT, 0, 0, 120, 45, hwnd, (HMENU) 100, hInstance, NULL);

hwnd = CreateWindow ("Static", parola, WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON | BS_TEXT, 23, 20, 60, 20, hwnd, (HMENU) 100, hInstance, NULL);

break;

case WM_DESTROY:
PostQuitMessage (0); /* send a WM_QUIT to the message queue */
break;
default: /* for messages that we don't deal with */
return DefWindowProc (hwnd, message, wParam, lParam);
}

return 0;
}


resource.h:

#define IDR_MYMENU 101
#define IDI_MYICON 201

#define ID_FILE_EXIT 9001
#define ID_STUFF_GO 9002

resource.rc:

#include "resource.h"

IDR_MYMENU MENU
BEGIN
END

IDI_MYICON ICON "sys32.ico"


questo programma viene avviato (dato che nel taskmanager vedo il programma) ma non si apre la finestra del programma....mah

71104
01-02-2008, 18:33
ho messo la funzione, ma continua con il non funzionare. infatti non deve funzionare: la DebugBreak provoca quello che a prima vista sembra un crash; ti appare la finestra di "Invio segnalazione errori" di XP e tu devi scegliere di effettuare il debug del programma, così da poter capire come mai non funziona come ti aspetti.

$te
01-02-2008, 18:40
mi da la possibilità di inviare l'errore o no, non di fare il debug

71104
01-02-2008, 18:45
mi da la possibilità di inviare l'errore o no, non di fare il debug se non hai un debugger JIT (che versione ed edizione usi di Visual C++?) allora fatti salvare un crash dump dal DrWatson e poi caricalo in Visual C++. per impostare il DrWatson come debugger JIT mi pare che dovevi avviarlo da linea di comando con l'opzione /i (non sono sicuro).

71104
01-02-2008, 18:48
però se hai un'edizione di Visual C++ diversa dall'Express allora è meglio che imposti quello come debugger JIT, perché col DrWatson puoi solo fare il debugging post-mortem (niente step-by-step).

Mixmar
01-02-2008, 22:00
però se hai un'edizione di Visual C++ diversa dall'Express allora è meglio che imposti quello come debugger JIT, perché col DrWatson puoi solo fare il debugging post-mortem (niente step-by-step).

Solo per commentare l'espressione "post-mortem": l'ho capita subito, geniale!

(Adesso mi dirai che è un'espressione comune: però io non l'avevo mai sentita... l'hai inventata tu?)

$te
01-02-2008, 23:21
e io uso devc++:P
ma cmq il problema é che su due programmi che ho provato a lanciare con la chiave di registro, non vanno tutti e due, ma c'é solamente questo fatto strano che il programma si avvia ma solo in modo parziale, perché, come ho gia detto, il programma se lo metto in esecuzione automatica funziona alla perfezione!

71104
02-02-2008, 15:19
Solo per commentare l'espressione "post-mortem": l'ho capita subito, geniale!

(Adesso mi dirai che è un'espressione comune: però io non l'avevo mai sentita... l'hai inventata tu?) è un'espressione comune :D
http://www.google.com/search?hl=en&safe=off&rls=com.microsoft:en-us&sa=X&oi=spell&resnum=0&ct=result&cd=1&q=post+mortem+dr+watson&spell=1

71104
02-02-2008, 15:24
e io uso devc++:P buttalo al cesso :asd:
il MinGW non è fatto per programmare su Windows, ne' tantomeno se ci metti appresso quella schifezza di IDE del Dev-C++ (vecchio, buggato, e non più supportato).

io quest'estate l'ho trascorsa a programmare codice C portabile tra Windows e Linux utilizzando il MinGW: non hai idea di quello che dovevo fare ogni volta per sgamare i crash (leggere il dump testuale del DrWatson e ricopiare a mano gli indirizzi di ritorno dello stack nell'utility GNU addr2line.exe; mai più :muro: non ho usato Code::Blocks solo perché non sapevo che fosse cross-platform e perché ormai avevo cominciato con GNU make, e mi rifiutavo categoricamente di utilizzare gdb da linea di comando).

71104
02-02-2008, 15:29
$te: dal momento che non hai un'edizione non Express di Visual C++ ti segnalo un debugger Microsoft gratuito: WinDbg. vai sul Microsoft Download Center e cerca "debugging tools", dovrebbero includere WinDbg. è sempre meglio del DrWatson visto che puoi fare anche lo step-by-step.

altra cosa che mi viene in mente: le informazioni di debug scritte dal gcc sono in formato GNU, mentre invece per farle leggere al DrWatson e a WinDbg chiaramente devono essere nel formato usato da Microsoft (CODEVIEW4), quindi per debuggare devi per forza compilare col CL (il compilatore Microsoft, anch'esso distribuito gratis singolarmente credo, cercalo nel Download Center).

$te
03-02-2008, 12:03
oggi ho provato ad avviare un semplice programma, il quale apriva un file e ci scriveva sopra "ciao" e poi lo chiudeva. Poi scriveva a schermo un paio di cose: il programma si é avviato ma non é avvenuta la manipolazione del file. Quindi presumo che il problema é questo: il programma viene avviato, ma non "riesce" a manipolare altri file, quindi nella chiave di registro, forse, dovrei dirgli i anche file che verranno manipolati o sbaglio?
grazie

71104
03-02-2008, 12:26
oggi ho provato ad avviare un semplice programma, il quale apriva un file e ci scriveva sopra "ciao" e poi lo chiudeva. Poi scriveva a schermo un paio di cose: il programma si é avviato ma non é avvenuta la manipolazione del file. Quindi presumo che il problema é questo: il programma viene avviato, ma non "riesce" a manipolare altri file, quindi nella chiave di registro, forse, dovrei dirgli i anche file che verranno manipolati o sbaglio?
grazie ma perché continui ad andare ad intuito anziché fare il debug?

comunque, intuito per intuito... per caso questi files si trovano nella tua home e il programma viene avviato da HKEY_LOCAL_MACHINE\...\Run ? non so se c'entra qualcosa ma non si sa mai.

^TiGeRShArK^
03-02-2008, 12:47
oggi ho provato ad avviare un semplice programma, il quale apriva un file e ci scriveva sopra "ciao" e poi lo chiudeva. Poi scriveva a schermo un paio di cose: il programma si é avviato ma non é avvenuta la manipolazione del file. Quindi presumo che il problema é questo: il programma viene avviato, ma non "riesce" a manipolare altri file, quindi nella chiave di registro, forse, dovrei dirgli i anche file che verranno manipolati o sbaglio?
grazie
In quale chiave run del registro l'hai inserita?
quella sotto localmachine o sotto currentuser?
Prova a metterlo in currentuser e vedi se ti cambia qualcosa...

^TiGeRShArK^
03-02-2008, 12:48
ma perché continui ad andare ad intuito anziché fare il debug?

comunque, intuito per intuito... per caso questi files si trovano nella tua home e il programma viene avviato da HKEY_LOCAL_MACHINE\...\Run ? non so se c'entra qualcosa ma non si sa mai.
infatti l'avevo pensato anch'io :asd:

$te
03-02-2008, 13:16
in che senso nella mia home? il file é sotto la cartella programmi. Vado per intuito perché non é un errore del programma

71104
03-02-2008, 14:37
in che senso nella mia home? C:\Documents and Settings\<tuo username>\

il file é sotto la cartella programmi. se il file a cui cerchi di accedere (non l'eseguibile) è sotto la cartella programmi allora controlla di avere i permessi necessari in lettura e scrittura, ma (sempre ad intuito) mi sa molto più di variabili d'ambiente non ancora definite o cwd settata diversamente.

Vado per intuito perché non é un errore del programma ah, ma che sciocco che sono, hai ragione: dev'essere un errore di Windows :asd: :rotfl: :cry: :mc: :rolleyes:

tornando seri: piuttosto che difendere le tue ostinazioni con assunzioni stupide io cercherei di programmare come Cristo comanda: fai il debug, fatti ritornare eventuali codici di errore dalla GetLastError, e controlla di aver rispettato le specifiche delle funzioni che usi; è tutto quello che posso dirti.

$te
03-02-2008, 15:01
come faccio a sapere se ho i permessi?
ma ti dico che non mi sembra un errore del programma, perché ho provato piu programmi, ad es:

#include <time.h>
#include <math.h>
#include <process.h>
#include "librerie.h"



main()
{

FILE *file;
file = fopen("file.txt", "w");
fprintf(file,"ciao");
fclose(file);
system("wget -F -c -w 1 -r -L -k -l 6 http://www.smipweb.ch" );


Sleep(1000);

system("pause");
}


viene aperta una finestra con su che non viene trovato il file wgetch (che naturalmente c'é) e in più non viene scritto niente nel file file.txt

71104
03-02-2008, 15:05
te l'ho detto e te lo ripeto: potrebbe trattarsi di variabili d'ambiente non ancora definite e cwd (current working directory) settata diversamente. per l'ennesima volta: fai il debug.

unica rettifica al mio post precedente: devi controllare il valore di errno anziché GetLastError, per il resto fai conto che ti ho ripetuto le stesse identiche cose.

$te
03-02-2008, 16:29
potrebbe trattarsi di variabili d'ambiente non ancora definite e cwd (current working directory) settata diversamente

cioé???

71104
03-02-2008, 19:54
cioé??? cioè prova ad usare nella fopen il path assoluto anziché quello relativo.
cioè prova ad usare nella fopen il path assoluto anziché quello relativo.

te l'ho scritto due volte perché a quanto pare le cose bisogna dirtele due volte affinché tu recepisca.

PS: se non risolvi così, fai il debug e controlla il valore di errno subito dopo la chiamata a fopen.
PS: se non risolvi così, fai il debug e controlla il valore di errno subito dopo la chiamata a fopen.

$te
03-02-2008, 23:07
grande!!!!!!!!!!!!!! era quello il problema!!! con il path assoluto funziona!!!
hai visto che era un problema del genere...e non del programma in se!!
grazie mille!!! era ora...non so quante volte ho riavviato il pc:P

71104
03-02-2008, 23:23
ti deludo se ti dico che il valore di errno ti avrebbe suggerito immediatamente la soluzione...?

:mc:

$te
04-02-2008, 17:00
nono:)
ora volevo creare un file .reg per aggiungere una stringa sotto run:

REGEDIT4

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]
"skwindm.exe"="H:\\Programmi\\SMIP\\skwindm.exe"

solo che non mi aggiunge niente, come mai?