Утвержденный метод с LoadLibrary
предназначен для , а не , используйте char const *
, но вместо этого используйте TCHAR const *
и используйте макрос _T
для всех литералов:
bool PluginLoader::Load(TCHAR const *path) {
path = _T("Release\\ExamplePlugin.dll");
HMODULE handle = LoadLibrary(path);
if (handle == 0)
{
_tprintf(_T("Path: %s\n"),widepath );
_tprintf(_T("Error code: %d\n"), GetLastError());
return false;
}
int (*load_callback)() = (int (*)()) GetProcAddress(handle, _T("_plugin_start@0"));
if (load_callback == 0)
{
return false;
}
return load_callback() == LOAD_SUCCESS;
}
При этом будут автоматически использоваться LoadLibraryW
, если определены _UNICODE
/ UNICODE
, и LoadLibraryA
, если они не определены. Аналогично, _T
будет выдавать узкие или широкие строковые литералы на одной основе, поэтому все они будут синхронизированы.
I обычно предпочитают явно использовать суффиксные функции W
и использовать префикс L
для строковых литералов. В любом случае Windows работает почти исключительно с широкими строками, поэтому версии с поддержкой A
, которые принимают узкие строковые литералы, в основном представляют собой небольшие заглушки, которые преобразуют свои аргументы в широкие строки, а затем вызывают версию с широкими строками. Использование широкоформатной версии напрямую экономит время и память.
Поддержка узких строк в Windows изначально была предусмотрена главным образом для совместимости с давно не существовавшей линией Windows 95/98 / SE / Me, в которой отсутствовала поддержка широких строк. Они давно исчезли, поэтому единственная причина использовать узкие литералы сейчас - это то, что вы получаете из какого-то внешнего источника.