VC++でDLLを作る際の注意点と解決策

このQ&Aのポイント
  • VC++でDLLを作成する際に、ソリューションを分割して呼出し元とDLLを別々に作成する方法がありますが、それには注意が必要です。リビルド時に『DLL.dllが無いぞ!』というエラーが出ることがあります。その場合、DLLソリューションから呼出し元EXEのディレクトリにDLL.dllをコピーすることで解決できます。
  • DLLとは、Dynamic Link Library の略で、複数のプログラムで共有される関数やリソースを含んだファイルです。DLLを作成する際は、呼出し元のプロジェクトにDLL.libのパスを追加する必要があります。
  • DLLの文字セットには『設定なし』を指定していますが、呼出し元の文字セットがマルチバイトである場合でも整合性が取れます。これは、DLLが自身で文字セットの変換を行っているためです。
回答を見る
  • ベストアンサー

VC++でDLLを作っていますがぁ~???

1ソリューション1プロジェクト主義です ⇒ 実はゴチャゴチャになってしまうのが怖いだけです ですからDLLを作る際にもDLL自体とDLL呼出し元を別のソリューションで作り、呼出し元のリンカーの入力の『追加の依存ファイル』でDLL.libを指定しています そうするとリビルドで『DLL.dllが無いぞ!』とのエラーが出ます 仕方がないのでDLLソリューションから呼出し元EXEのディレクトリィにDLL.dllをコピーするとOKになります 質問 DLLソリューションからDLL.dllをコピーしなくとも良い方法はありますか? 出来ましたら以下の愚問にもお答え頂ければ幸いです 愚問(1) DLL.dllとは何者ですか? 私にはDLL.libが必要なのですがぁ~ 愚問(2) DLLを作成する事例の各種のサンプルでは同じソリューションにDLLと呼出し元を入れて、出来上がったDLL.libのパスを呼出し元プログラムのプロジェクトの追加の依存ファイルに書込んでいます サンプルのように同じソリューションに入れるメリットは何ですか? 愚問(3) DLLの文字セットには『設定なし』を指定しています。呼出し元の文字セットはマルチバイトです。なぜ整合性が取れるのでしょうか? 宜しくお願い申し上げます

質問者が選んだベストアンサー

  • ベストアンサー
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

DLLが作っているライブラリの名称でしょうか。 質問 DLLソリューションからDLL.dllをコピーしなくとも良い方法はありますか? アプリケーション側の環境設定でパスにDLL.dllを置いたディレクトリを追加しておけば動くと思いますよ。 愚問(1) DLL.dllとは何者ですか? 私にはDLL.libが必要なのですがぁ~ DLL.dllが動的結合なライブラリの本体です。これはmain関数を持たないだけで実質的に実行プログラムと同等のものです。DLLを使うプログラムは実行時にDLL.dllを動的にリンクして実行されます。 DLL.libはVisualC++でDLL.dllの関数を名前でリンクできるようにするためのスタブファイルです。 愚問(2) サンプルのように同じソリューションに入れるメリットは何ですか? 別のソリューションだとパスとか依存関係とかを記述するのが面倒だからでは? 愚問(3) DLLの文字セットには『設定なし』を指定しています。呼出し元の文字セットはマルチバイトです。なぜ整合性が取れるのでしょうか? よく知りませんが日本語の受け渡しとかしなければ関係ないのでは?

sato-may
質問者

お礼

ありがとうございます 良く理解することができました 今後とも宜しくご指導願います ありがとうございました

関連するQ&A

  • VC++2008ExpressでProjectのPropertyをco

    VC++2008ExpressでProjectのPropertyをcopyする方法を教えてください。 ひとつのソリューションの下に、いくつかのプロジェクトを作っているのですが、既存のプロジェクトのプロパティ設定が新しく作ったプロジェクトにコピーされないため、プロジェクトを作るたびにプロパティ設定をやり直しています。設定したいのはリンカの追加の依存ファイル、C/C++の追加のインクルードディレクトリ、プロコンパイル済みヘッダの設定などです。 既存プロジェクトのプロパティを新規プロジェクトにコピーする方法がありましたら教えてください。よろしくお願いします。

  • VC++2010の「#include <」

    VC++ で、他人の作ったソースコードをビルドして実行してみています。 (WinPcapのデベロッパ向けのライブラリを使った、サンプルプログラムです。) VC++自体、あまり理解が深くないのですが、 「#include <」まで書くと、「ヘッダファイル名が表示される」プロジェクトと、「そうではない」プロジェクトがあります。 「そうではない」方のプロジェクトだと、ビルド時にincludeするライブラリが足りないとか、そんな感じのエラーが表示されます。 ぱっと見の違いは、「ヘッダファイル名が表示される」プロジェクトの場合は、 ソリューションエクスプローラに、「外部依存関係」というフォルダのショートカットがあり、ライブラリがどっさりあります。 「そうではない」プロジェクトについても、「#include <」で、ヘッダファイルを表示してくれるようにしたいのですが、どの様にすればよいのでしょうか?★ プロジェクトのプロパティの、 C++>プリプロセッサ>プリプロセッサの定義 リンカー>入力>追加の依存ファイル はどちらのソースも同じにしたのですが…。

  • visualstudioでc#のdllができない

    visualstudio2010を使用しています。 dllの作成をしたいのですが、なぜか作られません。 どこに手順を書きますのでどこに間違いがあるか教えてください。 (1)作成したプロジェクトを開く (2)ファイルー新しいプロジェクトを選択 (3)クラスライブラリを選択 (4)ソリューション(S):ソリューションに追加を選択ーOKボタン (5)DLLの中を書く (6)参照設定を選択する (7)ソリューションのプロパティのビルドでフォルダを指定する。 (8)ビルドする(もちろん通る) しかし、DLLはどこにも見当たらない。 検索しても、クラスライブラリを選択すれば自動的にできると書いてあるので、困り果てています 機能はMEFを使用し、僕ではない人が作ったDLLがすでに追加されており、僕もDLLを追加したいのですが、なぜかDLLが作成されません。 詳しいかたよろしくおねがいします。

  • VCで作成したDLLをBCBから呼び出す方法

    皆さん こんにちは。 VCで作成したCのAPIを実装したDLLをBCB6.0で作成したアプリケーションから呼び出そうとしています。 コンパイルは通るのですが、リンク時に以下のエラーメッセージが表示されてしまいます。   [リンカ エラー] 外部シンボル 'My Function' が未解決(C:\BCB\***.OBJ が参照) BCB6のフォームプロジェクトからDLLを利用するために、以下の手順を行いました。 (1)DLLをbcb用に変換する   implib -a aaa.lib aaa.dll (2)プロジェクトにaaa.libを追加 (3)aaa.dllをプロジェクトのフォルダに追加 (4)コードを以下のように実装しました    extern "C" __stdcall ulong SysInitialize(void);  //プロトタイプ宣言    ulong ulRetVal = SysInitialize(); //コード内での呼び出し この状態でコンパイルは通るのですがリンカでエラーが発生します      [リンカ エラー] 外部シンボル 'SysInitialize' が未解決(C:\BCB\TELIGEV\MAINDLG.OBJ が参照 他のサイトで調べたところ、C++特有の修飾子"@***"がついている場合に同じエラーが出るとのことだったので、dumpbin.exeを使ってDLL内の関数をダンプしたところ、関数名にはアンダースコアや@などは関数名についていないようです。 dumpbinの出力結果   1 1D 000065A0 SysInitialize このほか、自分なりに調べたところ、以下のサイトを見つけたのですが、英語力の弱さから解決策を見出すまでには至りませんでした。 Using Visual C++ DLLs with C++Builder http://bcbjournal.org/articles/vol4/0012/Using_Visual_C_DLLs_with_CBuilder.htm どなたか、ご助言いただけると助かります。 よろしくお願いします。

  • 参照するDLLを格納したフォルダをVSS管理したい。

    参照するDLLを格納したフォルダをVSS管理したい。 ソリューションに、プロジェクトA、プロジェクトBがあり、それぞれフォルダ1の中にある DLLを参照しています。 これをソリューションごとソース管理に追加したいのですが、他のメンバがVSSから 落とした場合、コンパイルが通らなくなるので、参照しているフォルダごとVSSに あげたいのですが…。 ソリューションにフォルダは追加できないようなので、VisualStudioからプロジェクトA、 プロジェクトBにそれぞれフォルダを作り、その中にそれぞれDLLを追加するしかないので しょうか? しかし、DLLのバージョンがあがった場合、大変手間です。 すべてのプロジェクトが同じDLLを参照し、かつ、そのDLLもソリューションに追加し、 ソース管理したときに一緒にVSSにアップロードされるようにはできないのでしょうか? ※VisualStudioは2005です。

  • [VC++2008].dllが見つからない

    Visual Studio C++ 2008で自作DLLを使用したプログラムを作成しています。 ソースツリーが以下のようにあります。 main.cpp で #pragma comment(lib,"myutil_d.lib") #include "myutil.h" とすると、コンパイルは成功するのですが、prog1.exeを実行すると: 「myutil_d.dllが見つからなかったため、このアプリケーションを開始できませんでした。」 と出てきてプログラムが始まりません。 これを解決する方法をご教授いただけるでしょうか? (MYPROGROOT) |-include | |-myutil.h | |-lib | |-myutil_d.dll | |-myutil_d.exp | |-myutil_d.lib | |-prog1 | |-Debug | | |-prog1.exe | | |-prog1.ilk | | |-prog1.pdb | |-prog1 | | |-Debug | | | |-BuildLog.htm | | | | ... | | | | | | |-main.cpp | | |-prog1.vcproj | | | |-prog1.ncb | |-prog1.sln | |-prog1.suo | |-prog2 |-Debug | |-prog2.exe | |-prog2.ilk | |-prog2.pdb |-prog2 | |-Debug | | |-BuildLog.htm | | | ... | | | | |-main.cpp | |-prog2.vcproj | |-prog2.ncb |-prog2.sln |-prog2.suo 「>ツール>オプション>プロジェクトおよびソリューション」下 インクルード ファイル :$(MYPROGROOT)\bin ライブラリ ファイル :$(MYPROGROOT)\include もちろんmyutil_d.dllを(MYPROGROOT)\prog\Debug\ に配置するとプログラムは動くのですが、prog1, prog2, と多数のプログラムで myutil_d.dllを使用するため、バージョン管理のために統一のディレクトリで .dllファイルを管理したいと考えています。

  • exeではなくdllを出力したい。

    VB2005環境です。 あるソリューション(仮にA)に、プロジェクトが2つ (C、Dとします)入っています。 どちらも新規追加しただけの状態で、空のフォームが あるだけです。 この状態でビルドをすると、Aフォルダの中にB、Cフォルダ、 それぞれB.exeと、C.exeが出力されています。 最終的には、このB、Cのプロジェクトは、別のソリューション(Z) に追加したいと考えています。 ソリューションZにあるプロジェクトにはメニュー用のフォームが あり、ボタンを押すと、C、Dのフォームがそれぞれ立ち上がる ようにしたいのです。 既にソリューションZにはプロジェクトがいくつか追加されていて、 ビルドをかけると、それらは○○.dllの形で出力されます。 C、Dも.DLLの形で出力させたいのですが、方法がわかりません。 やり方を教えていただけないでしょうか?

  • DLL参照時に指定されたモジュールが見つかりません。(HRESULT からの例外 0x8007007E) が発生してしまう。

    C++プロジェクト(Windowsフォームアプリ)を作成し、あるサイトで公開されているDLLを実装し→コンパイル→デバッグ実行させた所、問題なく動作が確認できたのですが、 クラスライブラリで作成したC++新規プロジェクトに同じくDLLを実装し、同一ソリューション内にC#又はC++でWindowsフォームアプリを作成し、先に作成したクラスライブラリプロジェクトを参照させる形態で作成した際に、コンパイル→デバッグ実行させた所、コンパイルは通ったのですがデバッグ実行時に、DLLを参照しようとしたタイミングで 「DLL参照時に指定されたモジュールが見つかりません。(HRESULT からの例外 0x8007007E) が発生してしまう。」 というエラーが発生してしまいました。 何故Windowsフォームアプリ単体時にはDLLが参照できたのに、クラスライブラリにし複数プロジェクトにして実行するとエラーが発生してしまうのか、どなたか原因、解法等 心得ておられましたら御指南のほど宜しくお願いします。 以下 事象詳細です。 開発環境:Microsoft Visual Studio 2008 公開DLL:USB-IOを制御する目的のUSBIODLLDemo.dllというDLLです。 <成功時> 1.C++プロジェクト(Windowsフォームアプリ)新規作成 2.DLLがインストールされているフォルダから.dllファイル, .hファイル、.libファイルをコピーしプロジェクト新規作成したフォルダにコピーする 3.プロジェクトのプロパティ→構成プロパティ→リンカ→入力→追加の依存ファイル に.libファイル名を記入 4.ダウンロードの.hファイルから __declspec(dllimport) BYTE __stdcall GetNo(void); __declspec(dllimport) void __stdcall P1Write(BYTE newVal); __declspec(dllimport) BYTE __stdcall P1WriteBit(BYTE Bit, BOOL Tf01); __declspec(dllimport) BYTE __stdcall P1Read(void);  をコピーしstdafx.h へ貼付け。 5.stdafx.hへ貼り付けた宣言がこのままではコンパイルが通らなかったため #define BYTE unsigned char #define BOOL bool  を追記。 6.ダウンロードしたDLLの関数を使用した一文を実装 7.コンパイル→デバッグ実行→ 無事実行完了! <エラー発生時> *下記事象ではC#Winフォームアプリを挙げていますがC++Winフォームアプリで試しても同じ結果になりました。 1.C++プロジェクト(クラスライブラリ)新規作成 2.DLLがインストールされているフォルダから.dllファイル, .hファイル、.libファイルをコピーしプロジェクト新規作成したフォルダにコピーする 3.プロジェクトのプロパティ→構成プロパティ→リンカ→入力→追加の依存ファイル に.libファイル名を記入 4.ダウンロードの.hファイルから __declspec(dllimport) BYTE __stdcall GetNo(void); __declspec(dllimport) void __stdcall P1Write(BYTE newVal); __declspec(dllimport) BYTE __stdcall P1WriteBit(BYTE Bit, BOOL Tf01); __declspec(dllimport) BYTE __stdcall P1Read(void);  をコピーしStdafx.h へ貼付け。 5.Stdafx.hへ貼り付けた宣言がこのままではコンパイルが通らなかったため #define BYTE unsigned char #define BOOL bool  を追記。 6.ダウンロードしたDLLの関数を使用した一文を実装(公開関数として) 7.C#プロジェクト(Windowsフォームアプリ)新規追加 *C++(Windowsフォームアプリ)でやっても同じ結果になりました。 8.新しい参照の追加で上のクラスライブラリプロジェクトを追加 9.フォームアプリ側でクラスライブラリプロジェクトの関数を実行する処理を実装 clsTest ctst; ctst.Exec(); 10.コンパイル→デバッグ実行→DLLを参照しようとしたタイミングでエラー発生! 「DLL参照時に指定されたモジュールが見つかりません。(HRESULT からの例外 0x8007007E) が発生してしまう。」 *クラスライブラリ側の、DLLの関数を呼んでいる部分をコメントアウトするとエラー無く実行できてしまいます。

  • BCBで作成したDLLを、VC++で静的リンクさせる方法

    BCBで作成したDLLを、VC++で静的リンクさせる方法 Borland C++ Builderで作成したDLLを、VC++アプリケーションで利用できるように LIBファイルに変換したいのですが、上手くいきません。 下記の手順を踏みました。 1. BCBでDLL作成   「VC++スタイルのDLL」で作成、   「VCLを使う」「CLXを使う」「マルチスレッドを使う」はチェックせず 2. コマンドラインで「IMPDEF.exe」を使用して、dllからdefファイル作成   (IMPDEF.exeは、\Borland\CBuilder6\Binに格納されていた) 3. コマンドラインで「LINK.exe」「LIB.exe」を使用して、defからlibファイル作成   (LINK.exeとLIB.exeは、\Microsoft Visual Studio\VC98\Binに格納されていた) 4. VC++プロジェクトファイルを保存したフォルダに、DLLファイルとlibファイルをコピー 5. VC++の「プロジェクト」-「設定」-「リンク」-「オブジェクト/ライブラリモジュール」に   作成したlibファイルを追加 VC++プロジェクトをビルドすると、下記のエラーメッセージが表示されます。 ///////////////////////////////////////////////////////////////////////////////// dllread.obj : error LNK2001: 外部シンボル "__imp__(関数名)@0" は未解決です LIBC.lib(wincrt0.obj) : error LNK2001: 外部シンボル "_WinMain@16" は未解決です Release/dllread.exe : fatal error LNK1120: 外部参照 2 が未解決です。 link.exe の実行エラー ///////////////////////////////////////////////////////////////////////////////// BCBとVC++のバージョンは、下記の通りです。 BCB Professional 6.0 VC++ 6.0 ちなみに、同じDLLを動的リンクで利用することは出来ました。 初心者の質問で申し訳ございませんが、解決策が分かる方がいらっしゃいましたら 教えていただけないでしょうか?

  • dllを参照追加をするときのパスについて

    VS2015で開発をしていてサードパーティ製のツールを使用しています。 そのうちのいくつかのdllをプロジェクトに参照追加しています。 端末(1)で新たにdllを参照追加しました。 端末(2)でフォルダ階層の違う場所でソリューションを開くと さきほどのプロジェクトの参照追加したdllに参照できないマークがつき、コンパイルするとワーニングが出力されます。 これはなぜでしょうか? また、以前から追加されているdllの「.csproj」内のパスは 端末(1)にはないディレクトリとなっているのですが、エラーになりません。 このプロジェクトファイル以外にもパスを管理しているものがあるのでしょうか? ご存知の方がいらしたらご教授頂きたいです。

専門家に質問してみよう