Delphi Tips
>> 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にバージョン情報が入らない
最終更新: 7820 日前
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
Osamu Takeuchi osamu@big.or.jp
Tips
Delphi
Home