クラスやスレッドをDLLにするには?

解決


まろ  2004-02-23 19:31:38  No: 7291

delphiで作成したCOMコンポーネントをDLLにしたいのですが、
調べてみて、関数だけとかならわかるのですが、クラスやスレッド
をどのようにDLLにすればよいのかわかりません。どうすれば
よいのでしょうか?


PSCL  2004-02-24 04:47:22  No: 7292

type節にclassを宣言すればよいのでは?


まろ  2004-02-25 02:19:54  No: 7293

う〜ん・・・
そのDLLを使う側でクラスを生成するわけですよね。
例えばa.dll内にある関数testを使用したい場合、
そのDLLを使う側で
procedure use(X:PChar); stdcall; external 'a.dll' name 'test';
としますよね。
DLL側はexports節に関数をプロトタイプして。
クラスの場合、クラスを生成しないとダメじゃないですか・・・
その場合、exports節をどうすればいいのか、クラス内のpublic関数には
全てstdcallを付けるのかどうか・・・という辺りがなんとも・・・。
delphiで作ったクラスをDLLにして、それをVCで使いたいのですが・・・。


masayan  2004-02-25 02:42:38  No: 7294

クラスをDLLにするのがActiveXを含むCOM(Component Object Model)では?(違ったかな?)


jok  2004-02-25 04:47:02  No: 7295

> delphiで作ったクラスをDLLにして、それをVCで使いたいのですが・・・。

それなら、DLL でクラスをつくったらよいのでは?
ただし、呼び出し側からみえるのは関数だけです。VC に Delphi でつくった
クラスのインスタンスをわたすことは出来ません。Delphi でつくった exe にも
共通パッケージを使わない限り、クラスのインスタンスをわたすことは出来ません。


まろ  2004-02-25 19:58:28  No: 7296

masayan様
ActiveXは含んでおりません。

jok様
という事は・・・VCで作り直す必用があるという事ですよね・・・(ノД`)...
あちこちサイトを徘徊しながらrs232cコンポーネントを真似して作ってみたのは
いいのですが、フォーム(UI側)がVCになった場合、このコンポーネントは
移植できるのだろうか・・・と検討していたもので・・・。
VCよくわからないしなぁ・・・やるしかないのか・・・。


にしの  2004-02-25 20:24:54  No: 7297

よくやる方法として、
procedure ClassName_ProcName(Obj: LongInt); stdcall;
function ClassName_FuncName(Obj: LongInt): Integer; stdcall;
というように、関数を用意し、クラスは各開発環境ごとに用意する、という手があります。
Delphi.VCそれぞれのクラスで、LoadLibrary, GetProcAddressしてやればよいかと。


jok  2004-02-25 22:53:46  No: 7298

内部的に Delphi で作ったクラスのインスタンスを使うのは問題ありません。
その DLL を呼ぶ exe の方からはは、にしのさんご指摘のように関数をとおして
それを操作するとよいのでは? ただし、インスタンスは関数のうちどれかが
最初に呼ばれたときにひとつだけ作成されるようにし、finally  節で破棄する
ようにしたらよいかと思います。


jok  2004-02-25 23:06:14  No: 7299

> finally  節で破棄する

finalization 終了処理部で破棄する、でした


まろ  2004-02-26 01:02:19  No: 7300

にしの様
jok様

内部的であれば問題ないのですか、なるほど。
それで関数を橋渡し的な使い方をしてやればいいんですね。
普通に考えれば「それもそうだな」とわかるようなものの、
悩んでいるときは周りが見えなくなってしまって・・・。
今回の場合は「内部的であれば問題ない」というのもわかって
いなかったのでそうもいかなかったとは思いますが・・・。
とりあえず前に進めそうです。みなさま、どうもありがとうございました。


jok  2004-02-26 11:41:38  No: 7301

> 内部的であれば問題ないのですか、なるほど。

たとえば、テキストファイルを読み込んでその文字数(バイト数)を返す
関数を DLL にしたとします。そのとき、TStringList を使って文字数を
取得するのはなんの問題もないのは明らかでしょう。自分でつくったクラス
のインスタンスを使う場合でも同じです。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加