mcrblog

vcpp-ml

1999年11月

30

[vcpp 00035197] Re: VBからのDLL呼び出し

渡辺です。

> > とりあえず、VBからVC側で作ったDLLを呼び出す一連の方法を教えてほしいで
す。
> > では、よろしくです。

VBからのDLL呼び出しが話題になってるようなので、ついでに質問したいのですが、
VCで作成したDLL内の、voidポインタを含む関数のコールはVBからできるのでしょう
か?

例えば、VBから、文字列ポインタを引数に含む関数を呼ぶときは、

foo(ByVal lpBuffer As String, ....);

などとしますよね?

voidのポインタのときは、As 何にすればいいのでしょう?

噂によるとVBから、DLL内のvoid * の関数のコールはできないようなことを聞いたの
ですが、
もし知っている方がおりましたらご教授ください。


よろしくお願いします。
30

[vcpp 00035196] Re: VBからのDLL呼び出し

はじめて投稿します、大野@岐阜大です。
#大学で教官に作らされた覚えがあるなぁ(^^; >DLL

At 21:45 99/11/30 +0900, you wrote:
> ってな感じでDLL(ファイル名test.dll)を作成して、VB側で
> Public Declare Sub msg Lib "test" (ByVal hwnd As Long)
> としてみたんですが、「エントリtestが見つかりません」
> とか言われて出来ませんでした。


> それで、なんとなく最初のところを
> #define EXPORT extern "C" __declspec(dllexport)
> としてみたら、なぜかメッセージボックスは表示できたんですが、
> その後「正しく呼び出せません」って言われてしまうんです。
> 一体どうなってるんでしょう??
> っていうか__declspec(dllexport)とはどういう意味なんですか?
「DLLにするんだったらこの関数をみんなに使わせてやってね」と、
DLLに頼み込むおまじないです。
#逆に、他のDLLから関数を借りる場合は、「_declspec(dllimport)」を
使います。
普通は、関数のDLLをDEF(定義)ファイルも一緒に書きます。
こんな感じですね。
---ここから
LIBRARY     test.DLL

EXPORTS
msg
---ここまで

> はっきり言ってDLLって何なのかってとこからしてよく分かってないんすよね・・。
> とりあえず、VBからVC側で作ったDLLを呼び出す一連の方法を教えてほしいです。
あまり参考にならないかもしれませんが(^^;一応、私のサイトの
http://www.imart.or.jp/~kotetsu/cpp
で、DLL作成・使用関連のTIPSを公開しています。

それでは。


大野哲生(Kotetsu)
岐阜大学教育学部物理学科
ICQ-UIN :17179260
mailto:k...@imart.or.jp
http://www.imart.or.jp/~kotetsu/
30

[vcpp 00035195] Re: 白黒2色の画像を表すクラスを作るには?

加藤歓隆です。

> PCではなくて、携帯ゲーム機などで使用するので300KBでも
> かなりの領域になります(;_;)可能な限り実行時のメモリの使用量を
> 減らしたいんです、また画像を圧縮すると展開に時間が掛かりすぎる
> し、ついでに扱いが面倒だし。。。

なるほどぉ。

しかし、例えばSetという名前のメンバ関数で
実装すれば、

bool foo(int pixel)
{
CB1Bpp cb(640, 480);

cb.Set(pixel, true);

if(cb[pixel+width])
return false;
banana = cb[pixel-width];
return true;
}

こんな感じになりますよね?

要は、=、+=、|=、&=……
代入演算子がこけるだけで、
読み出しだけなら特に問題は起こらないわけです。

この問題が難しくなる原因は、
たぶん配列演算子[]が、代入演算子よりも
演算優先度が高い、ということにあるのでしょう。
が、上のように、ほんの少し妥協すれば、
演算効率もクラス設計も楽勝で事が運ぶのです。
結果として、全体のメンテナンス性は良くなるのではないでしょうか?


> > しかし、これはあなたが求める文法が
> > 現実に即してない、ということでもあるのです。
> > 残念ながら、通常のメンバ関数を用いる方法で書かない限り、
> > このような汚い方法は避けられないのではないかと思います。

> うーん、無謀ですか(^^;;)、でも普通の配列と同じように使いたいん
> ですよ。
> 今回の場合はイテレーターパターンで実装できそうですが・・・上手い
> 実装方法が見つからないので、もう少し考えてみます。
> --
> Hideo Ikeuchi
> Demo Mod Otaku 古戦場 http://demo.and.or.jp/
> E-mail                i...@and.or.jp



30

[vcpp 00035194] Re: VBからのDLL呼び出し

日峰です。

書き足し。

> とりあえず、VBからVC側で作ったDLLを呼び出す一連の方法を教えてほしいです。
> では、よろしくです。

たとえば、文字列は、VBはUnicodeですから、それにあわせる必要があります。

手に入るか判りませんが、雑誌
   InsideWindows 1998年8月号 ソフトバンク
に一通りのことが書いてあります。
これが、私の知っている中でひと通りの説明が書いてあるものです。
# 著作権上私が勝手に公開できません。こういう場合どうしたらいいんでしょうか
ね。
Webの情報は知りません。
30

[vcpp 00035193] Re: VBからのDLL呼び出し

日峰です。

多分この時間では答える人がいないと思うので。
# 読む人もいなかったりして。

> DLLについてです。
> VC++側で作ったDLLをVBで呼び出せるのかなぁと思って、
> ためしに、VCで
>
> #define EXPORT __declspec(dllexport)
>
> EXPORT void msg(HWND hwnd)
> {
> MessageBox(hwnd, "test", "test", MB_OK);
> }
>
> ってな感じでDLL(ファイル名test.dll)を作成して、VB側で
> Public Declare Sub msg Lib "test" (ByVal hwnd As Long)
> としてみたんですが、「エントリtestが見つかりません」
> とか言われて出来ませんでした。

私は、VBを使っていないので判りませんが、
test はDLLだから、エントリは msg の方では?。

> それで、なんとなく最初のところを
> #define EXPORT extern "C" __declspec(dllexport)

# なんとなくでは extern "C" に気が付きませんね。

> としてみたら、なぜかメッセージボックスは表示できたんですが、
> その後「正しく呼び出せません」って言われてしまうんです。
> 一体どうなってるんでしょう??

EXPORT void __stdcall msg(HWND hwnd)
としましょう。

意味はヘルプで判ると思います。
VBのコール方法にあわせる必要があるからです。

> っていうか__declspec(dllexport)とはどういう意味なんですか?

別の実行プログラムから msg を呼べるようになります。
これが無いと、 msg は普通のサブルーチンであり、呼び出すことができません。

仕組みをいうと、 test.dll のある場所に msg の名前とアドレスが書かれて、
プログラムがそれを見て、test.dll の msg をコールできるようになります。

> ・・・あ、質問多くなってすいません。
> はっきり言ってDLLって何なのかってとこからしてよく分かってないんすよね・
・。

DLLの説明は話が長いので省略。

# よくわからないのに、
# > VC++側で作ったDLLをVBで呼び出せるのかなぁと思って、
# > ためしに、VCで
# という発想で作ってしまうその心がわかりません。

# 普段使っているWin32API も仕組みはDLLだったりします。

> とりあえず、VBからVC側で作ったDLLを呼び出す一連の方法を教えてほしいです。
> では、よろしくです。

一連というと、すべてですか?。
でも既にあなたは呼ぶことに成功していますね。
ということで、VBを使っていない私よりあなたのほうが詳しいです。

# 前は、defファイルを書いたけど、今のVBは書かなくてもいいのかなあ?。
記事検索
Amazon.co.jp
  • ライブドアブログ