LoadLibrary采用LPCTSTR

Ben*_*Ben 9 c++ windows dll loadlibrary

我想使用LoadLibrary开发一个插件系统.
我的问题是:我希望我的功能需要一个const char*并且LoadLibrary需要一个LPCTSTR.
我有一个聪明的主意(LPCSTR)path,不断给我一个模块未找到错误.

目前的代码如下.如果我取消注释该widepath = L..行,它可以正常工作.我已经阅读了使用MFC的解决方案,但我不想使用MFC.

当前代码:

bool PluginLoader::Load(char *path)
{
    path = "Release\\ExamplePlugin.dll";
    LPCTSTR widepath = (LPCTSTR)path;
    //widepath = L"Release\\ExamplePlugin.dll";

    HMODULE handle = LoadLibrary(widepath);
    if (handle == 0)
    {
        printf("Path: %s\n",widepath );
        printf("Error code: %d\n", GetLastError());

        return false;
    }

    int (*load_callback)() = (int (*)()) GetProcAddress(handle, "_plugin_start@0");

    if (load_callback == 0)
    {
        return false;
    }

    return load_callback() == LOAD_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 19

使用LoadLibraryA(),它需要一个const char*.

带有字符串的Winapi函数有两个版本,一个采用Ansi字符串的A版本和一个采用宽字符串的W版本.函数名称的宏(如LoadLibrary)可以扩展为A或W,具体取决于UNICODE是否为#defined.您正在使用有效的#define编译程序,因此您将获得LoadLibraryW().简单地作弊并使用LoadLibraryA().

  • 这就是为什么这个网站存在,它涵盖了不直观的;-) (4认同)

Osc*_*ros 8

我建议你使用TCHARLoadLibrary,而不是使用手动charwchar_tLoadLibraryALoadLibraryW做一个通用的应用程序,无论是UNICODEASCII字符.

所以你可以这样做:

TCHAR x[100] = TEXT("some text");

我建议你阅读这篇文章.LPCTSTR是一个const TCHAR*.

为什么要使用LoadLibrary替代LoadLibraryWLoadLibraryA?支持UNICODEASCII而不创建两个不同的程序,一个用于工作,char另一个用于wchar_t.

另外,看一看微软对它的看法:功能原型的约定