我想使用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;
}
答案 0 :(得分:17)
使用LoadLibraryA(),它需要一个const char *。
带有字符串的Winapi函数有两个版本,一个采用Ansi字符串的A版本和一个采用宽字符串的W版本。函数名称的宏(如LoadLibrary)可以扩展为A或W,具体取决于UNICODE是否为#defined。您正在使用有效的#define编译程序,因此您将获得LoadLibraryW()。简单地作弊并使用LoadLibraryA()。
答案 1 :(得分:6)
我建议您使用TCHAR
和LoadLibrary
而不是手动char
或wchar_t
和LoadLibraryA
或LoadLibraryW
来制作通用应用, UNICODE 和 ASCII 字符。
所以你可以这样做:
TCHAR x[100] = TEXT("some text");
我建议你阅读this article。 LPCTSTR
是const TCHAR*
。
为什么要使用LoadLibrary
代替LoadLibraryW
或LoadLibraryA
?在不创建两个不同程序的情况下同时支持 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 *
的宏。