Watch, Follow, &
Connect with Us

Please visit our new home
community.embarcadero.com.


Welcome, Guest
Guest Settings
Help

Thread: DLL内で使用する手続きや関数の宣言はどこに記述するのでしょうか?


This question is answered. Helpful answers available: 1. Correct answers available: 1.


Permlink Replies: 3 - Last Post: Apr 23, 2017 7:46 PM Last Post By: Makoto Saito
Hideyuki Oya

Posts: 87
Registered: 6/6/07
DLL内で使用する手続きや関数の宣言はどこに記述するのでしょうか?  
Click to report abuse...   Click to reply to this thread Reply
  Posted: Apr 22, 2017 11:46 PM
お世話になります。
Delphi10でDLLを作成しています。
DLL内で使用する手続きの宣言はどこに記述すればいいのでしょうか?
たとえば、次の場合はどうなるのでしょうか?
library Test;
 
uses
  System.SysUtils, System.Classes, Windows;
 
 
{$R *.res}
 
 
procedure MyTest(a,b:Integer);
begin
 
  func();//宣言がないのでエラーになる
end;
 
procedure func();
begin
 
end;
 
 
exports
  MyTest;
 
begin
end.
 
 


Edited by: Hideyuki Oya on Apr 22, 2017 11:47 PM
Hikaru FUKUSHI

Posts: 65
Registered: 11/11/02
Re: DLL内で使用する手続きや関数の宣言はどこに記述するのでしょうか?
Helpful
Click to report abuse...   Click to reply to this thread Reply
  Posted: Apr 23, 2017 4:34 AM   in response to: Hideyuki Oya in response to: Hideyuki Oya
Oyaさん、こんばんは。福士です。

Delphi10でDLLを作成しています。
DLL内で使用する手続きの宣言はどこに記述すればいいのでしょうか?
たとえば、次の場合はどうなるのでしょうか?

Delphiの場合exports句

動的にロードされるライブラリの作成 - RAD Studio
http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/%E5%8B%95%E7%9A%84%E3%81%AB%E3%83%AD%E3%83%BC%E3%83%89%E3%81%95%E3%82%8C%E3%82%8B%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E4%BD%9C%E6%88%90

の存在を除き、特にDLLだから、という違いはありません。例としてあげられているコードも、単にDelphiの
コードとして、未定義または前方宣言

前方宣言とインターフェイス宣言 - 手続きと関数(Delphi) - RAD Studio
http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/%E6%89%8B%E7%B6%9A%E3%81%8D%E3%81%A8%E9%96%A2%E6%95%B0%EF%BC%88Delphi%EF%BC%89#.E5.89.8D.E6.96.B9.E5.AE.A3.E8.A8.80.E3.81.A8.E3.82.A4.E3.83.B3.E3.82.BF.E3.83.BC.E3.83.95.E3.82.A7.E3.82.A4.E3.82.B9.E5.AE.A3.E8.A8.80

のないメソッドを呼び出そうとしてるためにエラーになっているだけです(funcをMyTestよりも上に記述
するか、前方宣言があればエラーにはなりません)。

通常DLLを作る場合、メンテナンス性を考慮してlibraryソース上にはexports句と、exports句に
記述したエクスポート関数のみを配置し、それ以外のメソッドは別ユニットで実装しておきlibraryソース
先頭のusesで参照できるようにするのが普通だとは思いますが(これは上述の通りDLLでなくても同じ)、
全てのメソッドをlibraryソースに記述しても、また全てのメソッドを別のユニットに記述しても、全く問題は
ありません。

あと質問をするときは"エラーになる"ではなく、"コンパイルエラーになる"のか"実行に例外が発生する"
のかを区別し、またそのときのメッセージはどうだったのかをコピー&ペーストで正確に(必要ならまずい情報の
部分を伏せ字にしたうえで)記述しておくことをお勧めします(漠然とエラーになりますといわれてもエスパー
ではないので)。

--
東洋テクニカルシステム株式会社 システム開発部 福士 光
Hikaru Fukushi (Toyo Technical System Inc.)
mailto:fukushi@tts-inc.co.jp

Edited by: Hikaru FUKUSHI on Apr 23, 2017 8:35 PM
Hideyuki Oya

Posts: 87
Registered: 6/6/07
Re: DLL内で使用する手続きや関数の宣言はどこに記述するのでしょうか?  
Click to report abuse...   Click to reply to this thread Reply
  Posted: Apr 23, 2017 4:55 PM   in response to: Hikaru FUKUSHI in response to: Hikaru FUKUSHI
ありがとうございます。
forwardを付けることによりエラー(ソースが間違っていたら、表示される赤い波線)が表示されなくなりました。

Hikaru FUKUSHI wrote:
Oyaさん、こんばんは。福士です。

Delphi10でDLLを作成しています。
DLL内で使用する手続きの宣言はどこに記述すればいいのでしょうか?
たとえば、次の場合はどうなるのでしょうか?

Delphiの場合exports句

動的にロードされるライブラリの作成 - RAD Studio
http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/%E5%8B%95%E7%9A%84%E3%81%AB%E3%83%AD%E3%83%BC%E3%83%89%E3%81%95%E3%82%8C%E3%82%8B%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E4%BD%9C%E6%88%90

の存在を除き、特にDLLだから、という違いはありません。例としてあげられているコードも、単にDelphiの
コードとして、未定義または前方宣言

前方宣言とインターフェイス宣言 - 手続きと関数(Delphi) - RAD Studio
http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/%E6%89%8B%E7%B6%9A%E3%81%8D%E3%81%A8%E9%96%A2%E6%95%B0%EF%BC%88Delphi%EF%BC%89#.E5.89.8D.E6.96.B9.E5.AE.A3.E8.A8.80.E3.81.A8.E3.82.A4.E3.83.B3.E3.82.BF.E3.83.BC.E3.83.95.E3.82.A7.E3.82.A4.E3.82.B9.E5.AE.A3.E8.A8.80

のないメソッドを呼び出そうとしてるためにエラーになっているだけです(funcをMyTestよりも上に記述
するか、前方宣言があればエラーにはなりません)。

通常DLLを作る場合、メンテナンス性を考慮してlibraryソース上にはexports句と、exports句に
記述したエクスポート関数のみを配置し、それ以外のメソッドは別ユニットで実装しておきlibraryソース
先頭のusesで参照できるようにするのが普通だとは思いますが(これは上述の通りDLLでなくても同じ)、
全てのメソッドをlibraryソースに記述しても、また全てのメソッドを別のユニットに記述しても、全く問題は
ありません。

あと質問をするときは"エラーになる"ではなく、"コンパイルエラーになる"のか"実行に例外が発生する"
のかを区別し、またそのときのメッセージはどうだったのかをコピー&ペーストで正確に(必要ならまずい情報の
部分を伏せ字にしたうえで)記述しておくことをお勧めします(漠然とエラーになりますといわれてもエスパー
ではないので)。

申し訳ありません。
いつも(自分としては)正確に書くことばかりに注意が行ってしまって、肝心なことが抜けてしますようです。
今後気を付けます。
Makoto Saito

Posts: 26
Registered: 12/5/04
Re: DLL内で使用する手続きや関数の宣言はどこに記述するのでしょうか?  
Click to report abuse...   Click to reply to this thread Reply
  Posted: Apr 23, 2017 7:46 PM   in response to: Hideyuki Oya in response to: Hideyuki Oya
今後気を付けます。
前に示した

[ディスカッションフォーラムのエチケット]
https://support.embarcadero.com/jp/forums/etiquette


『引用は最低限にとどめてください。以前の投稿内容を引用するときには、
関係のない部分を削除してください。また、挨拶やシグニチャの箇所も削除するように
します。一般的に、新しく入力するテキストより、引用されたテキストが多いのは
好ましくありません。』

とありますので,このようなことも考慮していただけると,
この場を情報収集の場として活用している立場としては嬉しいです.
Legend
Helpful Answer (5 pts)
Correct Answer (10 pts)

Server Response from: ETNAJIVE02