Delphi Tips 
-----------------------------

キーワード:DLL

>> Index

06/25 DLL にブレークポイントが設定できない
05/26 DLLの初期化・終了処理
02/08 Delphi/CBuilder で作った DLL から VB に文字列を返す
02/08 DLL のロード・アンロードでメモリリーク?
02/08 Visual C++ と Delphi で Exe/DLL のやり取り
02/08 32bitアプリから16bit DLLを呼び出す
02/08 Delphi3.0でDLLにバージョン情報が入らない

最終更新: 5357 日前

0332  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 2003/06/25 osamu rev 1.1
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 2003/06/25 osamu 編集
DLL にブレークポイントが設定できない

今までWin2000 + Del5Entの環境で開発していました。OSをWinXPに変えたところ、DLLのデバッグができなくて困っています。

D5 + WinXP では DLL のデバッグができないようです。
D7 では正常に動作するとの報告があります。
参照: [Delphi-ML:72312] [Delphi-ML:73399] <開発環境> <バグ> <デバッグ>

0301  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 2000/05/26 osamu rev 1.1
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 2000/05/26 osamu 編集
DLLの初期化・終了処理

D3 のヘルプでは DLL の終了処理に ExitProc を使うように書かれていますが、ExitProc のヘルプには ExitProc が下位互換性のためだけに残してあるものである旨の記述があります。実際(?)、ExitProc はパッケージの使用時に正常に動作しないようです。
このような問題を回避するためには、System ユニットにある DLLProc という変数を使います。

library MyLibrary;

uses Windows, SysUtils;

...

procedure DLLEntry(ul_reason_for_call: DWORD);
begin
  case ul_reason_for_call of
    // これらの値の意味については、Win32SDK の
    // DLLEntryPoint の HELP を参照してください。
    DLL_PROCESS_ATTACH:
        ;
    DLL_PROCESS_DETACH:
        ;
    DLL_THREAD_ATTACH:
        ;
    DLL_THREAD_DETACH:
        ;
  end;
end;

begin
  DllProc := @DLLEntry;
  DLLEntry(DLL_PROCESS_ATTACH);
end.


なお、初期化部分でエラーを発生させて DLL のロードを失敗させたい場合には、

(1) 初期化コードで System.ExitCode を 0以外に設定する。
(2) 初期化コード内で例外を起こす。

のいずれかを行います。
参照: [Delphi-ML:39301] [Delphi-ML:39147] <バグ> <PASCAL>

0118  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/02/08 osamu rev 1.1
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/02/08 osamu 編集
Delphi/CBuilder で作った DLL から VB に文字列を返す

> VB(VBA含む)は、ポインタが使えませんので、DLLで文字列を返す方法
> が知りたいです。 だれか、ご存知のかたおしえてください。

一番手軽なのは,SysAllocStringByteLen で文字列を確保して,そのまま返す方法です.

例)
  return SysAllocStringByteLen( "Hello", 5 );

内容は ShiftJIS で Ok.
ここで確保したメモリーは VB 側で開放されるそうです.
参照: [builder:6429] <Windows> <メモリ>

0106  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/02/08 osamu rev 1.1
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/02/08 osamu 編集
DLL のロード・アンロードでメモリリーク?

プログラム中でDLLの呼び出し、開放を何度も行っていると、システムモニターの「アロケート済みメモリ」がどんどん増えていきます。
簡単なDLL呼出しプログラムを作って試しましたが、呼出・開放を2018回繰り返すとプログラムがとまります。DLLの内容には関係ありません。
また、NT4/BCB3を使っても同様の現象が発生します。

以下の方法で回避できます。

・インポートライブラリを使ってDLLをリンクする
または
・DLLを作成するときにVCLをリンクしない(DLLでVCLを使っていない場合のみ)
参照: [builder:5705] <バグ> <メモリ>

0038  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/02/08 osamu rev 1.1
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/02/08 osamu 編集
Visual C++ と Delphi で Exe/DLL のやり取り

Visual C++ のアプリから Delphi のDLLを呼ぶ方法。
Delphi のアプリから Visual C++ のDLLを呼ぶ方法。
両方とも、[Delphi-ML:18743]で関川@数理システムさんが解説して下さってます。
参照: [Delphi-ML:18743]

0010  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/02/08 osamu rev 1.1
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/02/08 osamu 編集
32bitアプリから16bit DLLを呼び出す

英語ですが、
    http://www.itecuk.com/delmag/thunk95.htm
に詳しく説明があり、サンプルソースも落としてこれます。

ただし、Delphi Magagine で紹介されている方法を解読するには遙かなる時間がかかるでしょう。まあ、これは参考文献にとどめて置いて、やはり実践的なサンプルコードが必要かと思います。

DSP(http://ring.asahi-net.or.jp/archives/pc/delphi/)の、ThunkDownを使ったサンプル「freres.zip」と「zthunk.zip」や、ひきさんの「TExitWinコンポーネント」(http://www.vector.co.jp/authors/VA009712/take/)が参考になると思います。

また、UserリソースやGDIリソースを得るにはGetFreeSystemResourcesを使うのですが、これは16ビットAPIなため、ThunkDownが必要です。
サンプルまでひきさんが書いてくれました。
#でも Web からは添付文書取れないんだよね。。。(^^;;;
参照: [Delphi-ML:18742] <Windows>

0007  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/02/08 osamu rev 1.1
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/02/08 osamu 編集
Delphi3.0でDLLにバージョン情報が入らない

Delphi3.0で、「新規作成」から DLL を作ると、「バージョン情報を含める」のオプションを指定しても、効果が無い。
これは、.dpr ファイルに {$R*.RES} の一文が入らないために、リソースファイルはできるのに、リンクされないためだ。
uses節の後ろに手動で{$R*.RES} を書いてやればよい。
参照: [Delphi-ML:19012] <その他Windows関連> <アプリケーション> <開発環境> <Windows> <バグ>

[新規作成] [最新の情報に更新]

How To
Lounge
KeyWords

Tips
Delphi
Home
Osamu Takeuchi osamu@big.or.jp