![]() |
[C/C++] cannot convert `const wchar_t*' to `const char*'
Irgendwie mache ich einen Fehler, sehe ihn aber nicht mehr (es ist schon spät).
Code
Code:
UNICODE und _UNICODE ist definiert.
HINSTANCE hLib = LoadLibrary(DLLPATH);
Im Code gibt er mir dann diesen Fehler aus: Zitat:
|
Re: [C/C++] cannot convert `const wchar_t*' to `const char*'
Die Funktion erwartet einen Pointer auf ein WCHAR, du übergibst aber einen Pointer auf ein TCHAR.
Versuche es mit einem einfachen Cast auf WCHAR*. :) |
Re: [C/C++] cannot convert `const wchar_t*' to `const char*'
Aber das würde doch die Verwendung von dem Datentyp TCHAR ad absurdum führen. Wenn cih dann ohne Unicode kompiliere, würde der Datentyp ja wieder nicht stimmen.
Btw bekomme ich jetzt noch komische Linkerfehler, die vorher nicht da waren. :gruebel: Aber das gucke ich mir am Montag an. |
Re: [C/C++] cannot convert `const wchar_t*' to `const char*'
Code:
sollte mit oder ohne UNICODE/_UNICODE funzen ...
TCHAR* lpszDllPath = _T("kernel32.dll");
HINSTANCE hLib = LoadLibrary(lpszDllPath); |
Re: [C/C++] cannot convert `const wchar_t*' to `const char*'
Montag. ;) Aber die anderen Fehler die ich meine sind, dass er jetzt auf einaml Funktionen nicht mehr findet, die ich in einer anderen cpp-Datei habe und die ich über die Header-datei bekannt gmacht habe. Da muss ich am Montag noch mal gucken, was das ist. Aber erst seit ich UNICODE definiert habe. Mit TCHAR hatte ich vorher schon gearbeitet und alles in _T() gesetzt. Als ich dann UNICODE definiert habe, mochte er das mit dem _T() aufeinmal nicht mehr bei _tprintf(). :gruebel:
|
Re: [C/C++] cannot convert `const wchar_t*' to `const char*'
Aha ja, jetzt geht es. Keine Ahnung, was das war. Aber gibt es keine Wide-String Version von GetProcAddress?
Code:
Das nimmt er nämlich nicht. Ich muss den Pfad erst nach char* zurückcaste. Aber dann findet er den Prozedur-Einsprungspunkt nicht. :gruebel:
GetProcAddress(hLib, DLL_JNI_CREATE_JVM);
|
Re: [C/C++] cannot convert `const wchar_t*' to `const char*'
Zitat:
erst unicode LoadLibraryW((WCHAR*)lpszDllPath) hier kein ergebnis dann Ansi LoadLibrary(lpszDllPath); dann bist auf ner sicheren seite. gruß |
Re: [C/C++] cannot convert `const wchar_t*' to `const char*'
Es geht nicht um LoadLibrary, es geht um GetProcAddress. Und da ich die Datentypen TCHAR und das Makro _T benutze ist es egal, ob ich mit Unicode oder Ansi kompiliere. Definiere ich Unicode nimmt er automatisch die WideString Version der Funktion, kompiliere ich mit Ansi nimmt er die Ansi-Version. Beispiel:
Code:
Das ist nicht das Problem. Nur definiere ich die Prozedur so:
#ifdef UNICODE
return SetCurrentDirectoryW( #else return SetCurrentDirectoryA( #endif
Code:
und rufe GetProcAddress so auf:
TCHAR* const DLL_JNI_CREATE_JVM = _T("JNI_CreateJavaVM");
Code:
Bekomme ich als Fehlermeldung:
FARPROC proc = GetProcAddress(hLib, DLL_JNI_CREATE_JVM);
Zitat:
Zitat:
Aus den Header-Dateien werde ich auch nicht schlau:
Code:
Und:
WINBASEAPI
FARPROC WINAPI GetProcAddress ( __in HMODULE hModule, __in LPCSTR lpProcName );
Code:
Zu finden in WinBase.h.
//
// for GetProcAddress // typedef UINT (WINAPI* PGET_SYSTEM_WOW64_DIRECTORY_A)(__out_ecount_part_opt(uSize, return + 1) LPSTR lpBuffer, __in UINT uSize); typedef UINT (WINAPI* PGET_SYSTEM_WOW64_DIRECTORY_W)(__out_ecount_part_opt(uSize, return + 1) LPWSTR lpBuffer, __in UINT uSize); // // GetProcAddress only accepts GET_SYSTEM_WOW64_DIRECTORY_NAME_A_A, // GET_SYSTEM_WOW64_DIRECTORY_NAME_W_A, GET_SYSTEM_WOW64_DIRECTORY_NAME_T_A. // The others are if you want to use the strings in some other way. // #define GET_SYSTEM_WOW64_DIRECTORY_NAME_A_A "GetSystemWow64DirectoryA" #define GET_SYSTEM_WOW64_DIRECTORY_NAME_A_W L"GetSystemWow64DirectoryA" #define GET_SYSTEM_WOW64_DIRECTORY_NAME_A_T TEXT("GetSystemWow64DirectoryA") #define GET_SYSTEM_WOW64_DIRECTORY_NAME_W_A "GetSystemWow64DirectoryW" #define GET_SYSTEM_WOW64_DIRECTORY_NAME_W_W L"GetSystemWow64DirectoryW" #define GET_SYSTEM_WOW64_DIRECTORY_NAME_W_T TEXT("GetSystemWow64DirectoryW") #ifdef UNICODE #define GET_SYSTEM_WOW64_DIRECTORY_NAME_T_A GET_SYSTEM_WOW64_DIRECTORY_NAME_W_A #define GET_SYSTEM_WOW64_DIRECTORY_NAME_T_W GET_SYSTEM_WOW64_DIRECTORY_NAME_W_W #define GET_SYSTEM_WOW64_DIRECTORY_NAME_T_T GET_SYSTEM_WOW64_DIRECTORY_NAME_W_T #else #define GET_SYSTEM_WOW64_DIRECTORY_NAME_T_A GET_SYSTEM_WOW64_DIRECTORY_NAME_A_A #define GET_SYSTEM_WOW64_DIRECTORY_NAME_T_W GET_SYSTEM_WOW64_DIRECTORY_NAME_A_W #define GET_SYSTEM_WOW64_DIRECTORY_NAME_T_T GET_SYSTEM_WOW64_DIRECTORY_NAME_A_T #endif |
Re: [C/C++] cannot convert `const wchar_t*' to `const char*'
Das sind genauch die Ecken warum ich C/C++ nicht wirklich mag. Dieses ganze rumgepointere auf die verschiedensten Typen kann einen noch verrückt machen.
Aber hier mal etwas Code zu GetProcAddress, den ich mir irgendwann mal für ein FH-Projekt ausm Netz zusammengesucht hab als ich den Program Files - Folder gesucht hab:
Code:
Wie Du siehst wird in GetProcAddress einfach nur ein LPCSTR reingeworfen, und der wird je nach Bedarf (Unicode / nicht unicode) gefüllt.
#include <windows.h>
#include <tchar.h> #include <shlobj.h> #define NUM_ELEMENTS(x) (sizeof((x)) / sizeof((x)[0])) LPCTSTR lpszShell32 = TEXT("shell32.dll"); LPCTSTR lpszSHFolder = TEXT("shfolder.dll"); #ifdef UNICODE LPCSTR lpszGFP = "SHGetFolderPathW"; #else LPCSTR lpszGFP = "SHGetFolderPathA"; #endif typedef HRESULT (WINAPI * SHGETFOLDERPATH)(HWND, int, HANDLE, DWORD, LPTSTR); UINT_PTR GetProgramFilesFolder(LPTSTR lpFolder, UINT cchMax) { SHGETFOLDERPATH pfnGFP; HINSTANCE hDll; UINT_PTR cch = 0; TCHAR szFolder[MAX_PATH * 2]; if(NULL != (hDll = LoadLibrary(lpszShell32))) { if(NULL != (pfnGFP = (SHGETFOLDERPATH)GetProcAddress(hDll, lpszGFP))) { if(SUCCEEDED(pfnGFP(NULL, CSIDL_PROGRAM_FILES, NULL, SHGFP_TYPE_CURRENT, szFolder))) { _tcsncpy(lpFolder, szFolder, min(cchMax, NUM_ELEMENTS(szFolder))); lpFolder[cchMax - 1] = TEXT('\0'); cch = _tcslen(lpFolder); } } FreeLibrary(hDll); } if(!cch) { if(NULL != (hDll = LoadLibrary(lpszSHFolder))) { if(NULL != (pfnGFP = (SHGETFOLDERPATH)GetProcAddress(hDll, lpszGFP))) { if(SUCCEEDED(pfnGFP(NULL, CSIDL_PROGRAM_FILES, NULL, SHGFP_TYPE_CURRENT, szFolder))) { _tcsncpy(lpFolder, szFolder, min(cchMax, NUM_ELEMENTS(szFolder))); lpFolder[cchMax - 1] = TEXT('\0'); cch = _tcslen(lpFolder); } } FreeLibrary(hDll); } } return(cch); } |
Re: [C/C++] cannot convert `const wchar_t*' to `const char*'
Hm, wenn ich nach LPCSTR caste, findet er den Prozedureinsprungspunkt auch nicht.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz