LoadLibrary采用LPCTSTR

时间:2011-03-06 03:12:11

标签: 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;
}

4 个答案:

答案 0 :(得分:17)

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

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

答案 1 :(得分:6)

我建议您使用TCHARLoadLibrary而不是手动charwchar_tLoadLibraryALoadLibraryW来制作通用应用, UNICODE ASCII 字符。

所以你可以这样做:

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

我建议你阅读this articleLPCTSTRconst TCHAR*

为什么要使用LoadLibrary代替LoadLibraryWLoadLibraryA?在不创建两个不同程序的情况下同时支持 UNICODE ASCII ,一个用于char,另一个用于wchar_t

另外,看看微软对此的评价:Conventions for Function Prototypes

答案 2 :(得分:1)

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定义时会自动使用W。同样,L将在相同的基础上提供窄或宽字符串文字,因此它们都保持同步。

通常更喜欢明确使用A后缀函数,并在字符串文字上使用{{1}}前缀。 Windows无论如何都几乎只在内部使用宽字符串,因此版本{{1}} - 带有窄字符串文字的后缀版本大多是小的存根,它们将参数转换为宽字符串,然后调用宽字符串版本。使用宽字符串版本可以节省时间和内存。

Windows中的窄字符串支持最初主要是为了与长时间不存在的Windows 95/98 / SE / Me系列兼容,因为它缺乏广泛的字符串支持。那些已经消失了很长一段时间,所以现在使用窄文字的唯一原因是因为那是你从外部来源提供的。

答案 3 :(得分:0)

如果继续对参数使用char *,则会遇到文件名中使用异常字符且LoadLibrary失败的情况。更改函数以改为使用wchar_t,当你在它时,创建参数const,因为你没有修改字符串。

bool PluginLoader::Load(const wchar_t *path)

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