Konwersja const char* do LPCTSTR

Konwersja const char* do LPCTSTR
mto9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 380
0

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

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

Niestety przy kompilacji dostaje błąd:

Kopiuj
'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 ?

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
0

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

Kopiuj
#ifdef UNICODE
#  define _UNICODE
#endif

a jak nie to odwrotnie

Kopiuj
#ifdef _UNICODE
#  define UNICODE
#endif
Azarien
  • Rejestracja: dni
  • Ostatnio: dni
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:

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

taki kod będzie przejrzystszy.

mto9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 380
0

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

Kopiuj
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:

Kopiuj
serwer.obj:-1: error: LNK2019: unresolved external symbol __imp__RegCloseKey@4 referenced in function (...) 
Azarien
  • Rejestracja: dni
  • Ostatnio: dni
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.
mto9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 380
0

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

Kopiuj
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.