LoadLibrary函数接受一个LPCTSTR参数

10

我想使用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;
}
4个回答

23

使用LoadLibraryA()函数,它需要一个const char*参数。

Winapi函数有两个版本的字符串处理函数,一个是使用Ansi字符串的A版本,另一个是使用Unicode字符串的W版本。这些函数名有一个宏定义,例如LoadLibrary,它会根据是否已经定义了UNICODE选择使用A或者W版本。你正在编译程序时启用了这个#define,所以你获得了LoadLibraryW()。只需直接使用LoadLibraryA()即可。


7
为此,这个网站存在了,它涵盖了不太直观的内容;-) - Hans Passant

8
我建议您使用TCHARLoadLibrary代替手动使用charwchar_t以及LoadLibraryALoadLibraryW来创建通用应用程序,支持UNICODEASCII字符。

因此,您可以这样做:

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

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

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

此外,请查看Microsoft关于此的说明:函数原型的约定


0

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;
}

当定义了_UNICODE / UNICODE时,这将自动使用LoadLibraryW,否则将使用LoadLibraryA。同样,_T会根据相同的基础条件给出窄字符串或宽字符串字面值,因此所有内容都保持同步。

我通常更喜欢显式地使用带有W后缀的函数,并在字符串字面值上使用L前缀。Windows 几乎完全使用内部宽字符串,所以接受窄字符串字面值的A后缀版本主要是转换其参数为宽字符串,然后调用宽字符串版本的小桥梁。直接使用宽字符串版本可以节省时间和内存。

Windows 中狭义字符串的支持最初主要是为兼容早已过时的 Windows 95/98/SE/Me 系列而存在的,这些系统缺乏宽字符串支持。这些系统已经消失了相当长的时间,因此现在仅使用窄字符串字面值的唯一原因是来自某些外部源代码的限制。


0

如果您继续使用char *作为参数,当文件名中使用不寻常的字符时,LoadLibrary将会失败。改用wchar_t来替换函数,并且在此过程中将参数设置为const,因为您不会修改该字符串。

bool PluginLoader::Load(const wchar_t *path)

我认为你会发现,在32位Windows上,LPCTSTR是一个宏,当程序选项设置为Unicode时,它会扩展为const wchar_t *


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接