0

Windows では、 のバリアントの 1 つを使用して、以前に に書き込まれたLoadLibrary()を で開こうとしています。 dllstd::filesystem::pathofstream

注:実行時にリンクすることで標準の方法で使用できるため、dllが正しく記述されていることはわかっています。

以下の2つの回答の方法を組み合わせようとしています。

std::string を LPCSTR に変換するには?

ファイルシステムのパスを文字列に変換する方法

これはかなり基本的なことのように思えますが、これまでに試したことは何でも LPCSTR への変換に関するエラーが発生するか、C2228: left of '.c_str' must have class/struct/union困惑しているようなものです。

簡単な例を次に示します。

// Assuming I have 
// std::filesystem::path path1 
// correctly set, I should be able to directly access it in
// a number of ways; i.e. path1.c_str(), path1.string.c_str(), etc.
// in order to pass it the function or a temp variable.
// However direct use of it in LoadLibrary() fails with the C2228 error.

HINSTANCE hGetProcIDDLL = LoadLibrary(path1.c_str());

LoadLibraryA()マクロを避けて直接呼び出してみましたが、うまくいきませんでした。、、 path1.wstring() などpath1で渡すさまざまな方法も試しましたが、うまくいきませんでした。また、 内でのキャストを回避するために、さまざまな方法で一時変数を使用してみました。path1.string()path1.string.c_str()LoadLibrary()

LPCSTR temp_lpcstr = path1.c_str();  // Also tried things like path1.string() path1.string.c_str()

// Also tried just using a temp string...
std::string temp_string = path1.string(); // and variants.

エンコーディング(など)を試してみたいと思っていますが、直接path1.u8string()使用する必要はないと思います。LoadLibraryA()

私は C のキャストを避けようとしており、c++ の static_ または dynamic_ を好みますが、動作するものは何でも使用します。

どんな助けでも大歓迎です。

前もって感謝します。

UPDATE

@eryk-sunのコメントと@Gulrakの回答で解決しました。path1.c_str()私のセットアップでは、それだけのように見えますwchar_tが、LoadLibrary() マクロはそれを取得して LoadLibraryW() に指示していませんでした。

注:将来これに出くわす可能性のある他の人のために、私の特定のセットアップの詳細を次に示します。16.1.0 (~VS2019) の MSVC コンパイラを使用していますが、これは VSCode と CMake から呼び出されています。私は_UNICODEを明示的に定義していませんが、VSCodeのインテリセンスは確かにそれがどこかで定義されていると考えており、LoadLibraryA()を指しています。ただし、コンパイラは実際にはその定義を見ていないためpath1.c_str()wchar_t.

4

2 に答える 2

1

を返すクラスstringのメンバー関数を使用する必要があります。次に、返された文字列を 呼び出します。pathstd::stringc_strstd::filesystem::path path /* = initialization here */; std::string str = path.string(); /* some handle = */ LoadLibrary(str.c_str());

于 2020-01-28T07:54:16.513 に答える