質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

7回答

1937閲覧

Dllファイルの追加配布は簡単にできるのか?

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2019/05/08 05:06

編集2019/05/29 01:13

お世話になっています。
今回はDllの事で質問させてください。

要件

アプリケーションを設計・開発している際に、追加要件が発生することは多々あると思います。
その際にプログラムに直接追加するよりも、既存のDllファイルを使って解決する方法がありますが、そのプログラムをクライアントに簡単に配布する方法はありますでしょうか?

環境

環境:VB6、VisualStudio2017
アプリケーション側の言語:VB、VBA
Dll側の言語:C、C++、VB

追記

・インストーラは使わない方針です。
クライアント側に委ねる形でなく、複数台のクライアントにサイレント修正できるような方法を探しています。
一番の理想は、クライアントに置いてるアプリケーションと同じ階層にDllファイルを置くだけで解決するような方法です。
・作業するのは自分です。
コピーするだけで済むなら良いのですが、VB6の環境がないクライアントもあり、「Dllの参照設定」ができないせいでDllが使えません。
Dllの参照設定を行った端末では問題なく動きましたが、そうでない端末では動きませんでした。
https://qiita.com/mmYYmmdd/items/fc1d3cce6a39771c0f36
上記のアドレスを参考にしたのですが、Dllの内部が公開されていなかったため再現できませんでした。
・試したこと
Dllをアプリケーションと同じ階層に配置し、以下のようにコールしています

VB

1Private Declare Function ADD Lib "D:\YobidasiExe\DLLTEST01.dll" (a As Long, b As Long) As Long 2 3Private Sub CommandButton1_Click() 4 Cells(1, 2) = ADD(1, 1) 5End Sub

Dll側は以下のようになっています

C++

1#include "stdafx.h" 2#include <windows.h> 3 4void __stdcall DLL_TEST1() 5{ 6 MessageBox(NULL, "DLL呼び出し成功!", "test", MB_OK); 7 Beep(523, 200); 8} 9 10int __stdcall ADD(int a, int b) 11{ 12 return a + b; 13}

Dllで利用しているライブラリはないです。

・テストについて
端末AでC++を使ってDLLを作成し、同端末上VBAでDLLを呼び出すことは成功しました。
しかし端末BにDLLとExcelをコピーペーストして起動しても、DLLを呼び出すことはできませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2019/05/08 05:09

あなたのいう、簡単、という定義はどのようなものか説明を追記してください 普通にインストーラを配布するというのは、簡単に入るんでしょうか
sazi

2019/05/08 05:14 編集

何と比較しての簡単なのでしょうか? 配布するところからも含めたりしますか? 想定しているプログラムを改修して適用する手順を追記した上で、それと比較して簡単になる部分はあるかどうか? といった内容の質問なら回答しやすいと思います。
YAmaGNZ

2019/05/08 05:45

誰に作業させるの?
YAmaGNZ

2019/05/08 05:58

ご自身で作業されるのであれば、それぞれのPCにコピーしてまわればいいだけでは?
YAmaGNZ

2019/05/08 06:08

何故VB6の環境(開発環境ですよね?)が必要になるのですか? 作成したEXEやDLLを配布(コピー)すればいいだけですよね?
YAmaGNZ

2019/05/08 06:27

どのようにDLLをコールしているのですか? また、うまくいかなかったPCではどこにDLLを配置したのですか? そのDLLから利用しているライブラリ等はありますか?
YAmaGNZ

2019/05/08 06:49

配置した結果、D:\YobidasiExe\DLLTEST01.dllはあるのですか? 別の場所にコピーしてませんか? ただ Private Declare Function ADD Lib "DLLTEST01.dll" でEXEと同じ場所にDLL置いておけば動くような気がしますが・・・
atata0319

2019/05/14 04:05

DLL参照の話が一部の回答者と合わないのは、VB6のIDEでDLL参照するとCOMのレジストリ登録が自動的に行われることに起因していると推測しています。VB6で作成したDLLはCOMになるので機能自体はVB6で作成して新バージョンを都度別フォルダにインストールしてregsvr32すれば動的に入れ替えは可能になるでしょうが、回答をまとめるのが難しいですね。
Zuishin

2019/05/29 01:26 編集

COM 登録が必要となると結局インストーラーのあり物を使うか自分で作るかってだけの違いですか。 インストーラーを使うなという指示が癌なのでこれを撤回させるのが一番早道なんでしょうね。そもそも特に理由も無いのにこんなことで何日もつまずいてる方が業務上の損失は大きいと思います。
coco_bauer

2019/05/29 01:43

一度、状況を整理して、質問の内容を書き直してくれませんか。 回答へのコメントで五月雨式に断片的な情報が提供されていくのに、ついていけません。「簡単に」という質問なのですから、何が「難し」くて、どのように困っているのかを列記してみては如何でしょう。
asm

2019/05/29 02:53 編集

C++でDLLを作成しているのだからCOMとはあまり関係ないのでは? (VB6という時点で癌というか限りなく癌に近い悪性腫瘍というか・・・)
guest

回答7

0

ベストアンサー

質問文に書いていることと、本当に解決しなければならない問題が違っているように思います。
追記5以前の質問文から私が理解した内容:

  • アプリケーションAに、機能Fを追加したい。
  • 機能Fは以前に開発しており、F.DLLにまとめてある。
  • お客様の端末に、F.DLLを配置するだけでアプリケーションAに機能Fを追加できるか。

この問題の解答は、「No」です。肝は「F.DLLを配置するだけ」。アプリケーションAに機能Fを追加するには、アプリケーションAを改修しなければならない。しかし、配置するのはF.DLLだけ。アプリケーションAに機能追加されるはずがない。
これをするなら、たとえば画像表示ソフトで表示できる画像フォーマットを増やすの様に、関数の入出力を(ついでに関数名も)決めておきます。画像表示ソフトは、BMP.DLLやGIF.DLLからBitmap Load(String filename)の様な関数を呼び出します。アプリケーションAが「特定のディレクトリからDLLを検索し、すべてを確認して適したものを呼び出す」様に作成されていれば、特定のディレクトリにDLLを配置するだけで「*フォーマットを読む」という機能を追加できます。

本当に解決しなければならない問題は、こんな感じじゃないですか?

  • エクセルVBAで、機能Fを使いたい。
  • 機能Fは以前に開発しており、F.DLLにまとめてある。
  • 開発環境で、Declare文によりF.DLL内の関数を呼び出すようにし、実行できた。
  • お客様の端末(確認用端末)に、エクセルファイルとF.DLLを配置したが、機能Fが動作しなかった。
  • 開発環境のように、お客様の端末で、エクセルVBAから機能Fを呼び出すには、どうすれば良いか?
  • また、できるだけ配置の手数を少なくする(配置を間違えなく行う)には、どうすれば良いか?

質問に対する解答は、質問に付けられる条件によって変わります。
条件は文章で書くより、箇条書きで書く方が伝わりやすいです。
F.DLLが、C#で作られているのか、C++で作られているのかで、大きく異なります。C#(VB.NET, C++/CLI)で作られたものは、COM登録が必要です。C++ で作られたものは、不要です。VB6.0 以前については、わかりません。
範囲を広げすぎ、あるいは焦点を絞っていないので質問がぼやけ、解答を得られにくくしています。

Private Declare Function ADD Lib "D:\YobidasiExe\DLLTEST01.dll" (a As Long, b As Long) As Long

当然、エクセルファイルとDLLを配置する場所もD:\YobidasiExe\ですよね?
このコードで、「C:\Toolsに配置したが、実行時エラー53がでる。」なら、当然です。フルパスで指定しているのですから、それ以外のところは探しません。
ここに載せてあるコードが正しいなら、配置場所が "D:\YobidasiExe\DLLTEST01.dll"ではないから。ここを読む、って宣言してる。

投稿2019/05/29 07:19

編集2019/05/30 12:30
Q71

総合スコア995

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2019/05/30 13:03

Declareのフルパスについては以前に指摘しているんですよね・・・ それに関してのレスポンスがなかったので、提示されたソースの後にどうされたのかは分かりませんが・・・
guest

0

近いのはプラグイン DLL のやりくちでしょうか。

  1. exe は自身が指定するフォルダ(exe 自身と同一フォルダのことも多い)の下にある dll を検索する
  2. dll を LoadLibrary する
  3. dll 内の(特定名の)初期化メソッドを呼び出して、API インターフェースを確立する。もし初期化メソッドがないなら、その dll をアンロードする(対象外なので)

※VB6 だと 2. の LoadLibrary がトリッキーなことになりますが……

ですが、それで追加 DLL を読み込めたところで、本体プログラムはどのタイミングでそれを呼び出して処理するか、をどうやって制御するのでしょう?
どのみち最低一度は exe を更新しなければなりませんけど。

統合アーカイバプロジェクト対応ソフトのような作り(exeもdllも)をしていない限り、動的に機能を追加するのは難しいかと思います。

投稿2019/05/13 05:02

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/05/14 00:29

LoadLibraryは試しましたが、1.が上手くいきません。 VB6から参照設定しないと読み込んでくれない状態です。 >>どのみち最低一度は exe を更新しなければなりませんけど。 1度目は仕方がないことだと思います。1回読み込めるよう変更を加えれば、移行はDllを変更していけばいいと思いますので。
guest

0

DLLをレジストリ登録するという選択肢

投稿2019/05/08 07:38

sazi

総合スコア25206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/05/09 05:14

実はそれが一番困ってることなんですよね… 適用する端末が1、2台だったらそれでいいんですが、いろんな場所に複数台あるので1台1台レジストリ登録しようとすると手間がかかります。 逆にいえば、これをどうにかできれば問題は解決といっても差し支えありません。
sazi

2019/05/09 06:25 編集

手間ですか? >一番の理想は、クライアントに置いてるアプリケーションと同じ階層にDllファイルを置くだけで解決するような方法です。 と云う事なので、レジストリ登録するバッチを作っておいて、DLL配置後にダブルクリックするだけなので、簡単なひと手間が増えるだけですよね。 バッチ自体はDLLとセットで配置でもいいわけですし。
退会済みユーザー

退会済みユーザー

2019/05/13 00:21

レジストリ登録するバッチを同時配布するのは考えてませんでした。 ちょっと打診してみます。
退会済みユーザー

退会済みユーザー

2019/05/13 04:46

打診した結果、バッチもNGでした。 クライアント端末は常に業務で使われているため、アプリケーションを入れる際に業務を停止させたくないとのことです。
sazi

2019/05/13 04:58

DLL差し替えた場合に再起動必要じゃありませんか?
退会済みユーザー

退会済みユーザー

2019/05/13 05:34

業務中はアプリを使ったり使わなかったりします。 アプリの再起動はされると思いますが、ひょっとして端末自体の再起動でしょうか? その必要はなかったと思います。
sazi

2019/05/13 05:44 編集

>アプリケーションを入れる際に業務を停止させたくない アプリケーションというのが、質問の対象で、業務というのはそれとは関係ない話という事でしょうか? アプリの入れ替えの作業で業務を止めたくないということ? 今一理解できません。 WINDOWSアップデートみたいな仕組みということなら、配信サーバーも持たせて、各端末で集信し適用するという事になりますけど、そこまでの話なのでしょうか?
退会済みユーザー

退会済みユーザー

2019/05/14 00:33

>>アプリケーションというのが、質問の対象で、業務というのはそれとは関係ない話という事でしょうか? そういうことです。 アプリやDllの配布はネットワークにつながっている他PCからできますが、(今まで試したやり方だと)直接配布先端末で参照設定しなければいけません。 クライアントで参照設定させるのではなく、exeにdllの参照先を設定する方法はあるのでしょうか?
sazi

2019/05/14 03:20

操作端末から各端末へリモートプロシジャーコールでレジストリ登録とか
guest

0

VB6の環境がないクライアントもあり、「Dllの参照設定」ができないせいでDllが使えません。

もしかして、やりたいのはVB6でのLoadLibrary/GetProcAddressでしょうか?

CallWindowProcやEnumObjectsを用いる別の方法もありますが
どれも、かなりトリッキーなものですね。


VBAについては、Declare文を用いてやれば問題ないでしょう。

投稿2019/05/08 06:37

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/05/09 05:20

トリッキーではありますが、「やり方がある」なら1つの収穫ですね。 この路線で再度調べてみます。 Declare文は試しましたが、やはりdllの参照設定がされていないとdllを探せませんでした。
guest

0

インストールに GitHub を使ってみては?

追記

インストーラーを使用してはならない理由を確認し、使用しないことで業務が滞っていることを説明して使用を認めさせましょう。

投稿2019/05/08 06:14

編集2019/05/29 01:30
Zuishin

総合スコア28662

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/05/08 06:21

ネットワーク環境がない端末もあります。 導入の際はUSBでアプリケーションを置いて行いました。
Zuishin

2019/05/08 06:26

何が簡単で何が問題なのかわかりませんが、各端末でコンパイルが必要なんですか?
Zuishin

2019/05/08 06:29 編集

インストールし直しではいけない理由も教えてください。何が基準なのかわからなければ考えようがありません。
退会済みユーザー

退会済みユーザー

2019/05/08 06:47

>>各端末でコンパイル コンパイルではなく、Dllの参照が必要です。 あくまで自分が調べた範囲での事ですが、Dllの参照は開発環境から設定する方法しか見つかりませんでした。 >>インストールし直しではいけない理由 申し訳ありません。「上司の指示」という理由しかありません。
Zuishin

2019/05/08 06:51

つまり、同じディレクトリのアセンブリを動的に参照することさえできれば解決ということですか? 他にも何か問題がありますか?
退会済みユーザー

退会済みユーザー

2019/05/08 06:57

多分それだけだと思います。方法はありますか?
Zuishin

2019/05/08 07:02

asm さんの回答がそれにあたると思います。hatena19 さんのリンク先を全部試してダメだったのなら、おそらくはファイル名が間違っているんじゃないでしょうか?
退会済みユーザー

退会済みユーザー

2019/05/09 05:15

「間違ってない」と断言したいのですが、他に理由がないとしたら名前間違いが一番怪しいですよね。 念のためもう一度確認してみます。
guest

0

下記にいろいろな方法が紹介されています。
そのどれかで解決できませんか。

Daclare文のDLL検索フォルダを指定する - Qiita

投稿2019/05/08 06:00

hatena19

総合スコア33782

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/05/08 06:09

一通り試しました(といっても、Windows7を使っているので一番最後のはできませんでした)が、どれも以下のようなエラーが出ました 「実行時エラー53 ファイルが見つかりません:dll」
hatena19

2019/05/08 07:07

エラーメッセージから判断するに、ファイル名かパス名が間違っているとしか思えませんが、当然、それはチェック済みですよね。ならば、私にはお手上げです。
guest

0

クライアント側に委ねる形でなく、複数台のクライアントにサイレント修正できるような方法を探しています。

不可能です

#そんなことが可能なら、ウィルスやマルウエアを「簡単に」堂々と配布できますね

投稿2019/05/08 05:28

y_waiwai

総合スコア87784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/05/08 05:39

もちろん「完璧にそうしろ」とは言いません。 近い答えで何かヒントになりそうなものが欲しいです。 https://qiita.com/mmYYmmdd/items/fc1d3cce6a39771c0f36 この人のやってることみたいなことができればいいと思ってます。 (アプリ側は解析できたんですが、Dllが公開されてなかったので再現できませんでした)
y_waiwai

2019/05/08 05:49

ならそういうふーに質問に書きましょう 質問に書いてないことなんかこっちはしったこっちゃありませんぜ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問