При экспорте функций из DLL LoadLibrary () требуется преобразование строки с TEXT для компиляции без ошибок. - PullRequest
0 голосов
/ 26 мая 2020

Я учусь писать и использовать библиотеки DLL, и это моя первая попытка экспортировать функцию из моей dll. Это работает, но именно эта строка доставляла мне проблемы, и то, что я смог найти в отношении преобразования TEXT для UNICODE и ANSI, я думаю, мне нужно некоторое руководство. Насколько я могу найти, этот вопрос больше нигде на сайте не задавался, поэтому прошу прощения, если кто-нибудь найдет то, что я не смог. и ошибки C2664 относительно типа LPCWSTR

HINSTANCE hInstLibrary = LoadLibrary(TEXT("MyDLL.dll"));

Преобразование строки в TEXT решает проблему, хотя я не уверен, почему, и хотел бы знать

HINSTANCE hInstLibrary = LoadLibraryA("MyDLL.dll");

Строка, которую я решил использовать в рабочем примере. LoadLibraryA () расширяет LoadLibrary, чтобы принимать ANSI, а не Wide, что может быть root моего недоразумения. Почему это необходимо, когда в большинстве примеров я нахожу show LoadLibrary ("NameOfDLL.dll")?

Почему строка не удовлетворяет стандартному вызову LoadLibrary ()?

1 Ответ

1 голос
/ 26 мая 2020

LoadLibrary() - макрос препроцессора. Он отображается в LoadLibraryW() или LoadLibraryA() в зависимости от того, определено ли UNICODE или нет, соответственно. LoadLibraryW() принимает в качестве входных данных строку const wchar_t*, а LoadLibraryA() вместо этого принимает строку const char *.

Строковый литерал "MyDLL.dll" - это const char[10], который распадается в const char *. Если UNICODE определено, LoadLibrary("MyDLL.dll") не будет компилироваться, так как вы не можете передать const char *, где ожидается const wchar_t *.

TEXT() также является макросом препроцессора. Если UNICODE определено, он добавляет префикс L к указанному литералу, делая буквальное использование wchar_t, в противном случае префикс не добавляется и вместо него используется char.

Таким образом, если UNICODE, тогда LoadLibrary(TEXT("MyDLL.dll")) компилируется как LoadLibraryW(L"MyDLL.dll"), в противном случае он компилируется как LoadLibraryA("MyDLL.dll").

Большинство Win32 API, которые работают с текстовыми данными, имеют похожие A и W версии и соответствующие макросы препроцессора с поддержкой UNICODE. Таким образом, при использовании символьных / строковых литералов с этими API всегда следует использовать макрос TEXT(). В противном случае просто используйте API A и W напрямую по мере необходимости, в зависимости от типа текстовых данных, с которыми вы работаете.

...