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

IceBrain

Alteração de parâmetros de uma função

5 mensagens neste tópico

Boas. Eu estou a fazer um "emulador do registo do windows", usando o programa WinAPIOverride32 que me permite 'redirigir' as chamadas às funções da API do windows (kernel32.dll, advapi32.dll, etc) para uma dll minha. Já tenho a função RegOpenKeyEx implementada mas tenho um problema com a função RegQueryValueEx:

Tenho os dados a devolver num char*, mas não sei o como passá-lo para o lpData, até porque é uma LPBYTE. Quando chamo a função original, para passar um char* é só fazer (LPBYTE) var.

Mas não consigo fazer o mesmo ao contrário...

Função RegQueryValueEx

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/regqueryvalueex.asp

Obrigado pela ajuda!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não percebi muito bem o queres fazer! Algo do tipo "(char*) var" em que var é um LPBYTE?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu criei uma função que emula a RegQueryValueEx. O código que tenho é:

long mRegQueryValueExA(HKEY hKey, LPCTSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData)

{

    char resultado[50];

    //Usando hKey, recolher os dados e inseri-los em resultado.

    //...

    //Se tudo correr bem, devolver os dados, alterando lpType, lpData e lpcbData

    if( strlen(res) > 1 ) {

        lpType = (LPDWORD) REG_SZ;

        lpData = (LPBYTE) res;

        lpcbData = sizeof(lpData);

      MessageBoxA(NULL, (char*) lpData, "So para verficar o valor de lpData", MB_OK);

        return 0;

    }

Na message box, o valor está certo, mas depois quando a função retorna, lpData não está correcto. A função main() que chama RegQueryValueEx é:

int main()

{

    HKEY hkey;

    TCHAR lingua[50];

    DWORD dwBufLen;

    RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Activision\\Call of Duty 2"), 0, KEY_QUERY_VALUE, &hkey);

    RegQueryValueEx(hkey, TEXT("Language"), NULL, NULL, (LPBYTE) lingua, &dwBufLen);

    MessageBoxA(NULL, lingua, "K::A", MB_OK);

    return 0;

}

Esta message box devolve um valor estranho. Qual será o problema?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok, já resolvi. em vez de

lpData = (LPBYTE) res;

fiz:

memcpy(lpData, res, 50);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E percebeste qual é o problema? O tamanho da variavel vai ser sempre 50?

No código não indicas onde definiste "res", que era a parte mais importante. Provavelmente se tiver um scope interno,  o ponteiro não é válido quando sais da função. Parece-me ainda que seria possível usar directamente os parametros em vez de fazeres cópias, não?

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