2011-03-06 32 views
5

我想開發一個使用LoadLibrary的插件系統。
我的問題是:我想我的功能採取const char*LoadLibrary需要LPCTSTR
我有明亮想法做(LPCSTR)path這不斷給我一個模塊找不到錯誤。

當前代碼如下。如果我取消widepath = L..行的註釋,它工作正常。我已經閱讀使用MFC的解決方案,但我不想使用MFC。LoadLibrary取LPCTSTR

當前代碼:

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, "[email protected]"); 

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

    return load_callback() == LOAD_SUCCESS; 
} 

回答

12

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

採用字符串的Winapi函數存在兩個版本,一個採用Ansi字符串的A版本和一個採用寬字符串的W版本。函數名稱有一個宏,比如LoadLibrary,可以擴展爲A或W,具體取決於UNICODE是否爲#defined。你正在用#define編譯你的程序,所以你得到LoadLibraryW()。只需作弊並使用LoadLibraryA()。

+0

爾加。謝謝,我感到遲鈍,但在我的防守中,添加A並不那麼直觀。 – Ben

+3

這就是爲什麼這個網站存在,它涵蓋了直觀;-) –

6

我建議你使用TCHARLoadLibrary而不是使用手動charwchar_tLoadLibraryALoadLibraryW做一個通用的應用程序,無論是UNICODEASCII字符

所以,你可以這樣做:

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

我建議你閱讀this articleLPCTSTRconst TCHAR*

爲什麼用LoadLibrary而不是LoadLibraryWLoadLibraryA?要同時支持UNICODEASCII而不創建兩個不同的程序,一個使用char,另一個使用wchar_t

而且,看看什麼微軟稱它:Conventions for Function Prototypes

0

如果繼續使用char *的參數,你會碰到其中一個不尋常的人物在文件名和調用LoadLibrary使用情況將失敗。將函數改爲使用wchar_t來代替,並且當您在修改字符串時,請使用參數const

bool PluginLoader::Load(const wchar_t *path) 

我想你會發現在32位Windows即LPCTSTR是程序選項設置爲Unicode用於擴展爲const wchar_t *宏。

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("[email protected]")); 

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

這將自動使用LoadLibraryW_UNICODE/UNICODE是當它們不是時,它們被定義爲LoadLibraryA。同樣,_T將給予同樣的基礎上窄或寬字符串文字,所以它在同步所有入住。

I 一般更願意明確使用W後綴函數,並在字符串文字上使用L前綴。 Windows上運行幾乎完全與寬字符串內部無論如何,這樣走窄字符串文字版本A -suffixed版本是它們的參數轉換成寬字符串大多是小存根,然後調用寬字符串版本。使用寬字符串版本可以直接節省時間和內存。在Windows

精細字符串支持原本存在主要是爲了與長因爲被禁在Windows 95/98/SE/Me的線,缺乏寬字符串支持兼容性。那些已經走了很長一段時間,所以要使用窄文字的唯一原因是現在,因爲這是你是從一些外部供給什麼。