Konwersja const char* do LPCTSTR

0

Zgodnie z różnymi przykładami w internecie mam taki kawałęk kodu:

#include<tchar.h>
// ...
LPCTSTR regKeyPath = _T("Software\\Microsoft\\Windows\\CurrentVersion\\Run");

Niestety przy kompilacji dostaje błąd:

'initializing' : cannot convert from 'const char [46]' to 'LPCTSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

Dopiero uczę się winApi i nie za bardzo wiem gdzie leży przyczyna tego błędu, cośrobie nie tak ?

0

coś masz skopane, prawdopodobnie zdefiniowane UNICODE a brak _UNICODE albo odwrotnie.
spróbuj dodać coś takiego (przed includem):

#ifdef UNICODE
#  define _UNICODE
#endif

a jak nie to odwrotnie

#ifdef _UNICODE
#  define UNICODE
#endif
0

a tak serio, to makra _T i typy z literą T jak LPCTSTR były potrzebne do tworzenia aplikacji, które można skompilować jako ANSI albo UNICODE.

Ostatnia wersja Windowsa która nie obsługiwała (wprost) trybu unicode to Windows Me. Jeśli nie potrzebujesz kompatybilności ze starożytnymi systemami, możesz pisać wprost:

LPCWSTR regKeyPath = L"Software\\Microsoft\\Windows\\CurrentVersion\\Run";

taki kod będzie przejrzystszy.

0

Okej dzięki, mam jeszcze jedno problem a nie chce zakładać nowego tematu mam o to taka funkcję :

bool setAutorun(bool autorun)
{
    HKEY regKey = 0;
    LPCWSTR regKeyPath = L"Software\\Microsoft\\Windows\\CurrentVersion\\Run";
    LPCWSTR regSubKey = L"Server";

    if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, regKeyPath, 0, KEY_ALL_ACCESS, &regKey) != ERROR_SUCCESS) return false;

    if(autorun)
    {
        WCHAR path[MAX_PATH + 1];
        if(!GetModuleFileName(NULL, path, MAX_PATH + 1)) return false;

        if(RegSetValueEx(regKey, regSubKey, 0, REG_SZ, (LPBYTE)path, sizeof(path)) != ERROR_SUCCESS) return false;
    }
    else
    {
        if(RegDeleteKey(regKey, regSubKey) != ERROR_SUCCESS) return false;
    }

    RegCloseKey(regKey);
    return true;
}

Dostaje blędy linkera typu:

serwer.obj:-1: error: LNK2019: unresolved external symbol __imp__RegCloseKey@4 referenced in function (...) 
1

Błąd linkera oznacza zazwyczaj, że brakuje biblioteki.

  1. Piszesz nazwę funkcji na Google.
  2. Pierwszy albo jeden z pierwszych linków prowadzi do dokumentacji na MSDN.
  3. Tam w tabelce masz zawsze podane jaka jest nazwa biblioteki.
  4. Trzeba dodać odpowiedni plik .lib do parametrów kompilacji.
0

Dodałem odpowiednią bibliotekę, program kompiluje się lecz wywala crasha gdzieś w tej funkcji:

bool setAutorun(bool autorun)
{
    HKEY regKey = 0;
    LPCWSTR regKeyPath = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
    LPCWSTR regSubKey = L"Server";

    if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, regKeyPath, 0, KEY_ALL_ACCESS, &regKey) != ERROR_SUCCESS) return false;

    if(autorun)
    {
        WCHAR path[MAX_PATH + 1];
        if(!GetModuleFileName(NULL, path, MAX_PATH + 1)) return false;

        if(RegSetValueEx(regKey, regSubKey, 0, REG_SZ, (LPBYTE)path, (wcslen(path) + 1) * sizeof(WCHAR)) != ERROR_SUCCESS) return false;
    }
    else if(RegDeleteKey(regKey, regSubKey) != ERROR_SUCCESS) return false;

    RegCloseKey(regKey);
    return true;
}

Wydaje mi się że program wywala błąd już przy próbie otwarcia klucza w rejestrze. Nazwa zdarzenia problemu to BEX.

1 użytkowników online, w tym zalogowanych: 0, gości: 1