• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

xerxes

Regedit

26 mensagens neste tópico

Pessoal, gostava de saber como posso fazer para aceder ao regedit, de forma a conseguir criar, modificar e apagar regKeys. Tenho um programa que deve criar uma entrada de registo para poder ser executado.

Já agora outra duvida: como consigo aceder ao root do sistema tipo -> fopen("%systemroot%\system32\programa.exe", "a"); ou coisa parecida.

Desde já um grande obrigado por lerem e tentarem ajudar. :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado pelo link, mas nao consegui fazer nada com ele.

Procuro syntax em c++, akilo é visual basic. Se alguem puder ajudar, agradecia.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

N é? então pront, desculpem a minha ignorancia. mas n consigo perceber o codigo, nem o consigo por a funcionar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Aquilo é C++ Managed, ou seja, C++ adaptado à plataforma .NET. Se estás a utilizar C++ nativo, é mais complicado aceder ao registo. Tens aqui a referência do MSDN.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tb n ajudou mt, ninguem é capaz de m explicar as perguntas k fiz directamente em vez de m encaminhar para links?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Muita gente é capaz, mas aqui ninguém é empregado de ninguém. Tenho a certeza que se te deres ao trabalho de ler o conteúdo dos links que te dei consegues chegar às respostas que procuras, até porque no site da MSDN existem exemplos de como ler, inserir, alterar e apagar chaves e valores do registo do Windows.

EDIT: queres aceder ao registo ou ao Regedit? É que podes criar um ficheiro de texto e mandar o Regedit executá-lo para alterar o registo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

TheDark , quero aceder ao regedit do windows xp, tb n estou a dizer k são empregados, so tou a pedir por uma ajuda, se soubex as respostas n estava aki, antes de postar seja o k for tempo peskisar, vejo o forum como um auxilio, so peço para m explicarem as coisas SFF! tar a apontar para links é lixado para o k tem duvidas e facil para o explicador.! So gostava de uma resposta realmente util. Se n t importares, explica-me como fazes isso do ficheiro de texto para aceder ao regedit. SFF.

Desd já tks a todos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tudo bem, ainda faltam uns minutos para a meia noite... :D vou tentar explicar como aceder ao registo directamente a partir da API win32. O que disse sobre o ficheiro de texto foi só porque falaste em regedit no título.

Digamos que queres aceder à chave HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run, ver se está lá um determinado valor, e se estiver, alterá-lo para outro, e se não estiver, criá-lo.

Não sei nada disto de cor, vou seguir as indicações dadas no MSDN.

#include <tchar.h>
#include <windows.h>
#include <stdio.h>

#define MAX_VALUE_NAME 16383

void main() {
HKEY	hKey;
DWORD	cValues=0;	// numero de valores da chave aberta
TCHAR	achValue[MAX_VALUE_NAME];		// buffer para o nome do valor
TCHAR	subkeyName[] = TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
DWORD	cchValue = MAX_VALUE_NAME;	// tamanho do buffer

printf("A abrir a chave...");

RegOpenKeyEx(HKEY_CURRENT_USER,	//chave base
	subkeyName,				//subchave
	0,						// sempre zero
	KEY_READ | KEY_WRITE,	// pedido de leitura e escrita
	&hKey);					// chave

printf(" aberta!\nA pesquisar a chave...");

RegQueryInfoKey(
	hKey,					// key handle 
	NULL, NULL, NULL, NULL, NULL, NULL,
	&cValues,				// Numero de valores na chave
	NULL, NULL, NULL, NULL);

printf(" terminado!\nA percorrer %l valores:\n", cValues);

bool foundVal = false;
if (cValues) { //percorrer todos os valores da chave
	for (DWORD i=0; i<cValues && !foundVal; ++i) {

		cchValue = MAX_VALUE_NAME; 
		achValue[0] = '\0'; 
		RegEnumValue(hKey, // chave aberta
			i,				// índice do valor
			achValue,		// buffer para conter o valor
			&cchValue,		// tamanho do buffer
			NULL, 
			NULL,
			NULL,
			NULL);

		_tprintf(TEXT("\tValor encontrado: %s"), achValue);

		if (_tcsicmp(achValue, TEXT("notepad")) == 0) {
			printf(" -> notepad encontrado!\n");
			foundVal = true;
		}

		printf("\n");
	}
}

if(!foundVal) {
	printf("notepad nao encontrado.\nA criar valor...");
	//criar o valor
	//esta função serve também para alterar o valor a chaves existentes
	RegSetValueEx(hKey,	// subkey handle 
		TEXT("notepad"),	// value name 
		0,					// must be zero 
		REG_SZ,				// value type 
		(BYTE *) TEXT("notepad.exe"),		// pointer to value data 
		sizeof(TEXT("notepad.exe")));		// data size
	printf(" criado!\n");
}

//apagar o valor
printf("A apagar o valor...");
RegDeleteValue(hKey, TEXT("notepad"));
printf(" apagado!\n");
}

Pronto, exemplos para todas as operações. Se tiveres mais dúvidas avisa. 1h12 minutos... demorou mais do que esperava...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

MT obrigado TheDark. Isto sim é uma resposta esclarecedora, sem duvida a melhor k já tive em foruns. Agradeço pelo esforço, é assim k todos devem fazer, responder como o TheDark. Parabens e continua o teu excelente trabalho.

Mt obrigado. ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas isto foi à conclusão que com a informação do MSDN (e alguma paciência para procurar) conseguem-se as respostas.

Eu já tinha trabalhado com o registo, é verdade, mas de todas as vezes que preciso tenho que ir procurar porque é algo complicado e difícil de decorar, pelo menos não trabalhando com o registo frequentemente.

Não podes é esperar que alguém tenha sempre paciência de andar a fazer as pesquisas por ti...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens razão the dark, mas em casos de desespero e em ultimo recuros uso o forum. E este era um desses casos.

A tua resposta foi 100% esclarecedora.

Bem, qt ao meu segundo problema, estive a peskisar e encontrei a seguinte maneira para poder saber onde o windows está instalado:

#include <stdio.h>
#include <windows>
#include <conio.h>

int main(int argc, char *argv[])
{

    char FolderName[MAX_PATH];
    GetWindowsDirectory(FolderName,MAX_PATH);      // Aki tenho o caminho do windows, na foldername
    printf("o caminho do windows -> %s", FolderName);
    getch();

return 0;
}

O problem é que agora n consigo abrir os ficheiros de texto a usar esse caminho, tentei desta forma sei k está mal, mas é so para vcs terem uma nocção do k quero:

fopen(""FolderName"\\system32\texto.txt", "a");

Mas n tou a conseguir... ;)

Desde já tks pela ajuda []

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Experimenta o seguinte:

char caminho[MAX_PATH];
sprintf(&caminho, "%s\\system32\\texto.txt", FolderName);
fopen(caminho, "a");

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já agora the dark, so mais uma ultima coisa se n t importares.

Pretendo k o programa abra mais k 1 ficheiro de texto, em k o caminho seja o :

GetWindowsDirectory(FolderName,MAX_PATH);

sprintf(caminho, "%s\\system32\\", FolderName);

Mas o fixeiro a ser aberto tenha diferentes nomes:

#include <stdio.h>

#include <windows>

#include <conio.h>

int main(int argc, char *argv[])

{

char FolderName[MAX_PATH], caminho[MAX_PATH];

GetWindowsDirectory(FolderName,MAX_PATH);

sprintf(caminho, "%s\\system32\\", FolderName);

//printf("%s", caminho);

FILE *ficheiro;

ficheiro=fopen(caminho"texto.txt", "a"); // Isto n funciona, pq os ficheiros são texto, texto2, texto3 etc....

if(ficheiro!=NULL){

printf("abriu com sucesso");

fputs("OLA", ficheiro);

getch();

}else{

printf("ERRO de abertura");

  getch();

}

  return 0;

}

O comentário é so para exemplificar.

A duvida é se existe alguma nameira de concatenar o caminho com o nome do ficheiro a ser aberto dentro da função fopen (caminho"texto.txt", "a");

Axo k há maneira, mas n estou a conseguir.

Um obrigado a todos, em especial ao the dark pelo apoio prestado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Depois de várias tentativas e peskisas cheguei á seguinte suposta solução:

#include <stdio.h>

#include <windows>

#include <conio.h>

int main(int argc, char *argv[])

{

char FolderName[MAX_PATH], caminho[MAX_PATH];

GetWindowsDirectory(FolderName,MAX_PATH);

sprintf(caminho, "%s\\system32\\", FolderName);

printf("%s\n", caminho);

FILE *ficheiro;

ficheiro=fopen(("%stexto.txt", caminho), "a");

printf("%stexto.txt\n", caminho);

getch();

if(ficheiro!=NULL){

printf("abriu com sucesso");

fputs("OLA21212", ficheiro);

getch();

}else{

printf("ERRO de abertura");

  getch();

}

  return 0;

}

O problema é k está sempre a dar erro de abertura. N consigo perceber pq, pois os caminhos estão certos como s observa nos printfs...

Help please.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu sei bem o k escrevi no fopen. lá tb está a dizer k está errado!

So queria saber s existe alguma sintax assim. Les t bem a duvida??

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens que utilizar o sprintf para construir a string:

char destino[150];
sprintf(destino, "%s %s", "Isto substitui o 1º %s;", "Isto substitui o 2º");
puts(destino); //escreve "Isto substitui o 1º %s; Isto substitui o 2º"[/tt]

Tens aqui uma boa explicação de como o utilizar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

The dark, tks pela ajuda, mas o problema é k eu tenho de abrir mais k um ficheiro de texto, se uso o sprintf a string fica sempre concatenada com o caminho+texto.txt, assim n consigo abrir os outros ficheiros, por exe, texto2.txt etc...  :dontgetit:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Utiliza outra variável. Na caminho ficas com o caminho, noutra vais escrevendo os nomes dos ficheiros.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu sei bem o k escrevi no fopen. lá tb está a dizer k está errado!

So queria saber s existe alguma sintax assim. Les t bem a duvida??

Não tem nenhum comentario na linha do fopen a dizer que estava mal...

Como usas o sprintf para construir pensei k te tinhas enganado no copy paste... não existe nada daquele género.

Eu prefiro não dar a papa já feita :P  Na minha opinião, quem tem a dúvida aprende mais.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu prefiro não dar a papa já feita :P  Na minha opinião, quem tem a dúvida aprende mais.

Isso é o que eu tenho vindo a defender em várias threads.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, este post é nada mais k um agradecimento aos k m tentaram ajudar. Eu tb sou apologista de n dar a papa feita, mas as vezes por muito que procuremos parece k n encontramos resposta aos nossos problemas.

Consegui terminar a função do meu programa tal e kal conforme pretendia, um tks  grande a todos.

E parece k o the dark hj tá de parabens, se n tou em erro, pois faz anos. Parabens então (lembrei m pq eu tb faço anos hj  :P)

Abraço e continuem a fazer o vosso excelente trabalho.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora