none
Visual Studio 2005 y Windows 7. Ayuda al generar EXE de C++. RRS feed

  • Pregunta

  • Buenas,

    Tengo un proyecto en visual studio 2005 en Windows 7 en el cual modifico algunas claves del registro.

    El caso es que si inicio la depuración desde el visual studio lo hace bien y si genero el .exe al ejecutarlo directamente no hace nada, solo me funciona si inicio el programa exe en modo compatibilidad con Windows XP.

    Hay alguna manera de que este exe se ejecute de forma correcta sin tener que poner el modo de compatibilidad?

    Algunas opciones en la generación del exe o algo que se me escape?

    Muchas Gracias por la ayuda.

    Saludos.

    miércoles, 3 de octubre de 2012 10:11

Respuestas

  • Pues veo un par de problemas, pero depende de algo:  ¿Qué es _tcsdup()?  Me parece por el nombre que es una función que duplica una cadena de texto.  Si es así, ¿cómo se libera la memoria utilizada por estas copias?  Si no lo sabe, probablemente tiene fugas.

    El segundo punto que veo es el uso de dwLength.  Su código no le asigna un valor inicial, que debe ser igual a _countof(strSize) (si su compilador no sabe lo que es _countof(), entonces use sizeof(strSize) / sizeof(TCHAR) ).  Eso se debe a que RegQueryValueEx() espera usar este valor para asegurarse que el valor completo de la clave cabe en el búfer que se le está pasando (strSize en su caso).  Mentir en este número es invitar a problemas.

    HKEY hKey;
    TCHAR strSize[24];
    DWORD dwLength;
    
    LPTSTR szSubKeya =TEXT("Software\\Microsoft\\Office\\12.0\\Word\\Options");
    // Si existe el word instalado, si no existe no se hace nada
    if (RegOpenKeyEx(HKEY_CURRENT_USER, szSubKeya ,0,KEY_READ,&hKey) == ERROR_SUCCESS) 
    {
        //Si existe la clave ExportPictureWithMetafile
        dwLength = _countof(strSize);
        if(RegQueryValueEx(hKey,TEXT("ExportPictureWithMetafile"),NULL,NULL,(BYTE*)strSize,&dwLength) == ERROR_SUCCESS)
        {
            //si la clave es distinta de 0 
            if (_tcscmp(strSize, _T("0")))
            {
                // Se cambia el valor a 0
                LPCTSTR data = TEXT("0");
                RegSetValueEx (hKey, _tcsdup(TEXT("ExportPictureWithMetafile")), 
    0, REG_SZ, (LPBYTE)data, (DWORD)(_tcslen(data)+1) * sizeof(TCHAR));
            }
        }
        else
        {
            //no existe la clave del registro, se crea con el valor 0
            LPCTSTR data = TEXT("0");
            // no existe la clave, se crea
            RegSetValueEx (hKey, _tcsdup(TEXT("ExportPictureWithMetafile")), 
    0, REG_SZ, (LPBYTE)data, (DWORD)(_tcslen(data)+1) * sizeof(TCHAR));
        }
        //Se cierra el registro
        RegCloseKey(hKey);
    }



    Jose R. MCP
    Code Samples

    miércoles, 3 de octubre de 2012 16:22
    Moderador

Todas las respuestas

  • ¿Cuáles claves de registro?  ¿Qué funciones está usando para editar las claves?

    Nótese que aún siendo código correcto, Visual Studio 2005 tiene un runtime antiguo y podría estar haciendo algo que Windows 7 considera inapropiado y por lo tanto es por esto que requiere compatibilidad.

    Pero bueno, muestre código y enumere las claves de registro a modificar para descartar primero la posibilidad de que algo ande mal por ahí.


    Jose R. MCP
    Code Samples


    miércoles, 3 de octubre de 2012 14:18
    Moderador
  • El codigo es este:

    HKEY hKey;
    TCHAR strSize[24];
    DWORD dwLength;

    LPTSTR szSubKeya = _tcsdup(TEXT("Software\\Microsoft\\Office\\12.0\\Word\\Options"));
    // Si éxsite el word instalado, si no existe no se hace nada
    if (RegOpenKeyEx(HKEY_CURRENT_USER, szSubKeya ,0,KEY_READ,&hKey) == ERROR_SUCCESS) 
    {
    //Si existe la clave ExportPictureWithMetafile
    if(RegQueryValueEx(hKey,_tcsdup(TEXT("ExportPictureWithMetafile")),NULL,NULL,(BYTE*)strSize,&dwLength) == ERROR_SUCCESS)
    {
    //si la clave es distinta de 0 
    if (_tcscmp(strSize, _T("0")))
    {
    // Se cambia el valor a 0
    LPCTSTR data = TEXT("0");
    RegSetValueEx (hKey, _tcsdup(TEXT("ExportPictureWithMetafile")), 
    0, REG_SZ, (LPBYTE)data, (DWORD)(_tcslen(data)+1) * sizeof(TCHAR));
    }
    } else {
    //no existe la clave del registro, se crea con el valor 0
    LPCTSTR data = TEXT("0");
    // no existe la clave, se crea
    RegSetValueEx (hKey, _tcsdup(TEXT("ExportPictureWithMetafile")), 
    0, REG_SZ, (LPBYTE)data, (DWORD)(_tcslen(data)+1) * sizeof(TCHAR));

    }

    //Se cierra el registro
    RegCloseKey(hKey);


    Es un codigo que he añadido a un programa que ya funcionaba.

    Gracias.

    miércoles, 3 de octubre de 2012 16:06
  • Pues veo un par de problemas, pero depende de algo:  ¿Qué es _tcsdup()?  Me parece por el nombre que es una función que duplica una cadena de texto.  Si es así, ¿cómo se libera la memoria utilizada por estas copias?  Si no lo sabe, probablemente tiene fugas.

    El segundo punto que veo es el uso de dwLength.  Su código no le asigna un valor inicial, que debe ser igual a _countof(strSize) (si su compilador no sabe lo que es _countof(), entonces use sizeof(strSize) / sizeof(TCHAR) ).  Eso se debe a que RegQueryValueEx() espera usar este valor para asegurarse que el valor completo de la clave cabe en el búfer que se le está pasando (strSize en su caso).  Mentir en este número es invitar a problemas.

    HKEY hKey;
    TCHAR strSize[24];
    DWORD dwLength;
    
    LPTSTR szSubKeya =TEXT("Software\\Microsoft\\Office\\12.0\\Word\\Options");
    // Si existe el word instalado, si no existe no se hace nada
    if (RegOpenKeyEx(HKEY_CURRENT_USER, szSubKeya ,0,KEY_READ,&hKey) == ERROR_SUCCESS) 
    {
        //Si existe la clave ExportPictureWithMetafile
        dwLength = _countof(strSize);
        if(RegQueryValueEx(hKey,TEXT("ExportPictureWithMetafile"),NULL,NULL,(BYTE*)strSize,&dwLength) == ERROR_SUCCESS)
        {
            //si la clave es distinta de 0 
            if (_tcscmp(strSize, _T("0")))
            {
                // Se cambia el valor a 0
                LPCTSTR data = TEXT("0");
                RegSetValueEx (hKey, _tcsdup(TEXT("ExportPictureWithMetafile")), 
    0, REG_SZ, (LPBYTE)data, (DWORD)(_tcslen(data)+1) * sizeof(TCHAR));
            }
        }
        else
        {
            //no existe la clave del registro, se crea con el valor 0
            LPCTSTR data = TEXT("0");
            // no existe la clave, se crea
            RegSetValueEx (hKey, _tcsdup(TEXT("ExportPictureWithMetafile")), 
    0, REG_SZ, (LPBYTE)data, (DWORD)(_tcslen(data)+1) * sizeof(TCHAR));
        }
        //Se cierra el registro
        RegCloseKey(hKey);
    }



    Jose R. MCP
    Code Samples

    miércoles, 3 de octubre de 2012 16:22
    Moderador