アプリ版:「スタンプのみでお礼する」機能のリリースについて

DLLが見つからない

VisualC++でDLLを明示的に読み出す学習をしています。

作ったプログラムを動かすと、自作したDLL「Dll1.dll」が
みつからないようです。
以下でret=126です。


SetLastError(0);
hMyLib = LoadLibrary(LPCWSTR("Dll1.dll"));
if (hMyLib==NULL))
    int ret = GetLastError();

Dll1.dllは、.exeと.slnと同じ場所におきました。
Dll1.dllはソリューションエクスプローラで表示されていましたが、赤いマーク(警告?)
がついていたので、「プロパティを開いてプロジェクトに含まれる」項目をFalseからTrueに
変えたところ、赤いマークが消えました。

さらに、何を設定しなおせばよいのでしょうか?

A 回答 (4件)

>作ったプログラムを動かすと、自作したDLL「Dll1.dll」が


>みつからないようです。

勉強/実験ってことならDLLファイルの場所はフルパスで指定したらどうでしょうか?
一応、LoadLibrary()でカレントディレクトリも探すとは思いますが……。

「exeと同じディレクトリに置く」という場合でも、カレントディレクトリからではなく
実行ファイルのフルパス名を取得してから文字列操作でフルパス指定にした方がよろしいかと。
# カレントディレクトリについては操作によって意図しないまま変わっている場合がありますので。
    • good
    • 0
この回答へのお礼

またまたありがとうございます。
フルパスで書いてみたのですが、状況変わらずです。

フルパスで書くのはソースでよかったですか?
プロパティなど変える必要があるのでしょうか。

または、自作のDLLがよくないとか?(かなり簡単なものですし、
まだ関数を読んでいないですよね)

お礼日時:2017/09/14 14:04

>フルパスで書くのはソースでよかったですか?



LoadLibrary()で指定しているファイル名…ですね。
# 言うまでもないことですが、パス区切りの円マークはエスケープして下さいね。
# '/'にしておく…という手もありますけど。

>プロパティなど変える必要があるのでしょうか。

については……

>Dll1.dllはソリューションエクスプローラで表示されていましたが、赤いマーク(警告?)
>がついていたので、「プロパティを開いてプロジェクトに含まれる」項目をFalseからTrueに
>変えたところ、赤いマークが消えました。

というのが状況不明ですのでなんとも…。
該当プロジェクトにDLLを追加…とかそういう操作は不要かと思われますけど。
# C#などで利用する…とかだと必要かも知れません。C++/CLIでも必要なんでしょうかねぇ……。
    • good
    • 0
この回答へのお礼

再度、ありがとうございます。
フルパスで \\も/も使ってみましたが、ダメでした。

調べたところ、文字列のキャストが関係ありそうでした。
それだけが原因ではないかもしれませんが
文字列のキャストについてもう少し勉強してみます。

赤いマーク云々は、イチから作り直したところ
ソリューションエクスプローラからDLLが消えてしまったので
なかったことにします。いろいろいじりすぎて変なことをしたせいかもしれません。

もうしばらく締め切らないので、何かヒントがあったら教えてください。

お礼日時:2017/09/14 16:53

>調べたところ、文字列のキャストが関係ありそうでした。



ええっと……
>LoadLibrary(LPCWSTR("Dll1.dll"));
の書き方は確かに変ですね…。

コンパイラの設定での文字セットの変更に対応したいのであれば、
_T("Dll1.dll")
とか
_TEXT("Dll1.dll")
とかでよいのではないでしょうか?

https://msdn.microsoft.com/ja-jp/library/windows …
_TEXTではなくTEXT()か?
    • good
    • 0
この回答へのお礼

長くお付き合いいただき、大変感謝です。

文字セットについては私には難しいのですが、
とりあえず、プロパティの文字セットをマルチに変更し、_T(Dll1.dll")としてみたら、
エラーが4250に変わりました。
(4250:このアプリケーションはアプリコンテキストでのみ実行できます)

これは一歩進んだということなのでしょうか?
また、Dll1.dllは自分で作ったものですが、とあるアプリで提供しているDll2.dll
にしたら、やはり126のままです。Dll1.dllでできたら、Dll2.dllを利用するフェーズに
進みたいのですが。

お礼日時:2017/09/14 17:39

>エラーが4250に変わりました。


>(4250:このアプリケーションはアプリコンテキストでのみ実行できます)

https://www.reddit.com/r/learnprogramming/commen …
検索したらこんなのとか。
英語だけど……。

Dll1.dllの中身による…んでしょうかね。
上のURLのだと…Dllの中身はなんぞのクラスのようですが。
# C++のクラスをDLLとしてエクスポートできるのかは…私自身はやったことがないので不明です。

>これは一歩進んだということなのでしょうか?

「ファイルが見つからない」よりは進んだものと思われます。

>また、Dll1.dllは自分で作ったものですが、とあるアプリで提供しているDll2.dll
>にしたら、やはり126のままです。Dll1.dllでできたら、Dll2.dllを利用するフェーズに
>進みたいのですが。

こちらは不明。
    • good
    • 0
この回答へのお礼

本当にいろいろありがとうございました。
気を取り直して、試しにもう少しまともと思えるDll3.dllをロードしたところ
エラーがなくなっていました。

ということは、今まで試していたDllがよくなかったと考えられます。
Dll2.dllが使えないと困るのですが。

とにかくお付き合いくださり、大変感謝いたします。

お礼日時:2017/09/15 09:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!