2011-03-06 13 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バージョンの2つのバージョンで存在します。 LoadLibraryのように、UNICODEが#defineされているかどうかに応じて、AまたはWに展開される関数名のマクロがあります。その#defineを使ってプログラムをコンパイルしているので、LoadLibraryW()が得られます。単純に不正行為をして、LoadLibraryA()を使用してください。

+0

Gah。ありがとう、私は遅く感じるが、私の防衛では、Aを追加することは直感的ではない。 – Ben

+3

これは、このWebサイトが存在する理由、それは直感的ではない;-) –

6

は、私はあなたが両方のUNICODEASCII文字ため、TCHARLoadLibraryを使用しての代わりに、一般的なアプリケーションを作成するために、手動でcharまたはwchar_tLoadLibraryAまたはLoadLibraryWを使用することをお勧め。

だから、あなたができる:

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

私はあなたがthis articleを読んで示唆しています。 const TCHAR*です。

LoadLibraryWまたはLoadLibraryAの代わりにLoadLibraryを使用する理由は? UNICODEASCIIの両方をサポートするには、2つの異なるプログラムを作成せずに、charwchar_tを使用します。

また、Microsoftはそれについて言っていることを見てみましょう: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; 
} 

_UNICODE/UNICODEがあるときにこれが自動的にLoadLibraryWを使用します。それらがそうでないとき、LoadLibraryA。同様に、_Tは同じ基準で狭いか広い文字列リテラルを与えるので、すべてが同期しています。私は一般

は、明示的にW接尾辞の機能を使用して、文字列リテラルにL接頭辞を使用することを好みます。とにかくWindowsはほとんどの場合ワイド文字列を使用しているため、狭い文字列リテラルをとるバージョンAは、引数をワイド文字列に変換する小さなスタブで、ワイド文字列バージョンを呼び出します。ワイド文字列バージョンを使用すると、時間とメモリの両方が直接節約されます。

Windowsでの狭い文字列のサポートは、もともと長い文字列がサポートされていなかった長い間使われていなかったWindows 95/98/SE/Me行との互換性のために主に存在していました。それらはかなり長い間消えてしまっています。だから、狭いリテラルを使う唯一の理由は、あなたが何らかの外部ソースから供給されているからです。

関連する問題