- PR -

Delphi8にて動的DLLの呼び出し方法

投稿者投稿内容
灼熱
会議室デビュー日: 2004/03/04
投稿数: 13
お住まい・勤務地: 山口
投稿日時: 2004-03-06 10:37
「kiki様」
たびたび返信ありがとうございます。
やはり、必ず値“0”が戻ります。
フルパスでも同様でした。
この後もいろいろ考えてみましたが、分からずじまいです。
しばらくして、昔購入した本があることに気づき、
本棚から引っ張ってきて、この関数を見ました。この本によると、
function GetModuleHandle(lpModuleName: string): HMODULE;
の「lpModuleName」のファイル拡張子が省略された場合、“.DLL”が指定された
ものとみなされるそうです。
また、「FileExists」を使用してもTrueが返ってきていますので、ファイルの存在は、
確認済みです。
まだ、どこかに問題があるのでしょうね、きっと。
もし、また、何かございましたら、
よろしくお願い致します。
object
ぬし
会議室デビュー日: 2002/03/20
投稿数: 338
お住まい・勤務地: 香川県高松市
投稿日時: 2004-03-06 11:45
objectです。

「LoadLibrary」と「GetModuleHandle」は、確か基本的には同じ機能だと思います。

私の環境で「user32」と「独自dll」を「LoadLibrary」、「GetModuleHandle」させてみましたが、「0」以外の値が返って来ましたよ。

「灼熱」さんの環境で、「user32」は「LoadLibrary」、「GetModuleHandle」出来ますか?
object
ぬし
会議室デビュー日: 2002/03/20
投稿数: 338
お住まい・勤務地: 香川県高松市
投稿日時: 2004-03-06 11:57
上とダブリました。削除します。

[ メッセージ編集済み 編集者: object 編集日時 2004-03-06 11:59 ]
けんのん
会議室デビュー日: 2004/03/06
投稿数: 3
投稿日時: 2004-03-06 13:32
こんみちは。

すんません
私も、ちょっと、関係のないことですが、
最近Delphi8の日本語版を購入しました。
いろいろと言われていますが、私的には、8、なかなかよいです。
とはいえ、CHNさんの言われるように、Japanの対応は弱く、
いまだにホームページのFAQでは、Delphi 1.0だのDelphi 2.0だの
というタイトルが堂々と(一般的には、6、7、8くらいの題目にしておいて
昔のバージョンは奥の方に隠すものではないかと…)乱立してますし、
8を使っていて、WebのヘルプがすぐにBorland USAに行ってしまう
(当然ながらすべて英語)というのも、手抜きかな〜と。
結局行き詰まったときにBorland USAということになるのなら、
最初から英語版でもいいのかな…と、ここのところ思うようになりました。
(ま、エディタは漢字に対応してもらっていないと少々不便なので、
1Editorなどを使うとして…)、もう少しJapan様には、eCOM Supportingも含め
核となるところだけは死守してがんばってもらいたいところです。
けんのん
会議室デビュー日: 2004/03/06
投稿数: 3
投稿日時: 2004-03-06 13:35
あちゃ、↑↑↑。大変失礼しました。一見さんなもので、デフォルトで名前が未記入になるんですね。けんのんと申します。名も名乗らず、大変、失礼いたしました。
灼熱
会議室デビュー日: 2004/03/04
投稿数: 13
お住まい・勤務地: 山口
投稿日時: 2004-03-08 18:37
「object様」
何度も返信ありがとうございます。

procedure TForm1.Button1Click(Sender: TObject);
var
UHandle: HMODULE;
begin
UHandle := GetModuleHandle('user32.dll');
if UHandle <> 0 then begin
ShowMessage('True');
end else begin
ShowMessage('False');
end;

UHandle := LoadLibrary('user32.dll');
if UHandle <> 0 then begin
ShowMessage('True');
end else begin
ShowMessage('False');
end;
end;

いずれも、True(値='2010054656')が戻ってきます。
あと、C:\WINDOWS\SYSTEM32に、作成した[Library1.DLL]を
コピーして、上記の'user32.dll'のところを'Library1.DLL'に
したところ、GetModuleHandleのときは、Falseで、
LoadLibraryのときは、Trueが戻ってきました。

「けんのん様」
この件とは、別件ですが、
お時間があれば、下記の件をDelphi8で確認して頂きたいのですが・・・。
(なにぶんDelphi8の情報が少なくて…。)
-------------------------------------------
ASP.NET Web アプリケーションにて、
メニューより、プロジェクト - 参照の追加
[新しい参照]の[参照]ボタンをクリックすると、
ファイルの種類が“すべての参照(*.dll,*.ocx,*.tlb,*dlb,*.exe)”というダイアログが表示されますよね?
そしてご自分で作成したDLLファイルを選択し、[OK]ボタンをクリックすると、
うまく設定できます?それとも
“Failed to load resources from resource file Please check your Setup”
というエラーメッセージが出てきて、Delphi8が落ちないですか?
-------------------------------------------
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2004-03-08 19:07
引用:

いずれも、True(値='2010054656')が戻ってきます。
あと、C:WINDOWSSYSTEM32に、作成した[Library1.DLL]を
コピーして、上記の'user32.dll'のところを'Library1.DLL'に
したところ、GetModuleHandleのときは、Falseで、
LoadLibraryのときは、Trueが戻ってきました。



VCベースの知識で申し訳ないのですが、いままでの流れからDLLの参照ができていないだけ
だと思われます。

おそらくLoadLibraryでフルパスを指定していただければうごくと思います。

ちなみにLoadLibraryはDLLを読み込んでモジュールハンドルを取得、
GetModuleHandleは読み込んであるDLLのモジュールハンドルを取得します。

なので今回の例ではLoadLibraryは正常終了し、GetModuleHandleはエラーになります。
(おそらく呼び出す順番を逆にすると両方正常終了するはずです)

user32.dllは起動するときに自動的に読み込まれるはずなのでLoadLibraryでも
GetModuleHandleでもエラーになりません。



[ メッセージ編集済み 編集者: ゆうじゅん 編集日時 2004-03-08 19:08 ]
灼熱
会議室デビュー日: 2004/03/04
投稿数: 13
お住まい・勤務地: 山口
投稿日時: 2004-03-09 09:09
「ゆうじゅん様」
返信ありがとうございます。
>>VCベースの知識で申し訳ないのですが、いままでの流れからDLLの参照が
>>できていないだけだと思われます。
分かりました。とりあえず、「DLLの参照」の点から、
もう一度、確認したいと思います。
(Delphi8のインストール等の設定がおかしいのかな?)

少し時間がかかるかも知れませんが、
後日、結果を投稿致します。

スキルアップ/キャリアアップ(JOB@IT)