フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: [1] 2
トピック: DLLからEXEの型情報を取得したい
ishikawa-tatsuya
モデレータ
投稿数: 5
DLLからEXEの型情報を取得したい
on: 2014/07/31 08:19 Thu

お世話になります。
石川と申します。

最終的にやりたいことはこれです。
http://www.slideshare.net/tatsuyaishikawa7334/friendlydelphi

その第一段階として、以下のことをやりたいのですが、上手くいきません。

①ExeとDLLを作成。
②ExeからDLLのメソッドを呼び出す。
③そのDLLのメソッドの中でリフレクションを使って、Exeに定義されている型情報を取得する。

具体的にはRttiContextを使ってExeの型情報を取得したいのです。

var
RttiContext: TRttiContext;

begin
//TRttiContextでExeのクラスを取得したい
//でも取れない
RttiContext.FindType('UnitExe.ClassName');
RttiContext.GetTypes();

情報ありましたら、ご教授お願いします。

DEKO
管理者
投稿数: 2691
Re: DLLからEXEの型情報を取得したい
on: 2014/07/31 09:42 Thu

内容的にはこのような事ですかね?

[Delphi RTTI Over Executable Project (Stack Overflow)]
http://stackoverflow.com/questions/3643411/delphi-rtti-over-executable-project

毛利 春幸
メンバー
投稿数: 25
Re: DLLからEXEの型情報を取得したい
on: 2014/07/31 11:41 Thu

石川さん
http://www.gesource.jp/weblog/?p=6722
やまもとさんが書いてましたよー

ishikawa-tatsuya
モデレータ
投稿数: 5
Re: DLLからEXEの型情報を取得したい
on: 2014/07/31 12:26 Thu

>DEKOさん
ありがとうございます。
そのような内容です。
この方はExeから別DLLの型情報が取れないと言っているのですよね?
(英語苦手ですみません)
私はDLLから別DLLと呼び出し元DLLの型情報を取得したいと思っています。
そのスレッドを見る限り、できないのでしょうか?
(でも、最後の人はできるようなこと書いてますが・・・)

>もうりさん
ありがとうございます。
山本さんにも相談させてもらいました。
で、Exeのコードからであれば、その中の型情報にアクセスできるのですが、
ExeからロードされたDLLからExeに定義されている型情報が取れないのです。
で、ここで質問させてもらうことになりました。

DEKO
管理者
投稿数: 2691
Re: DLLからEXEの型情報を取得したい
on: 2014/07/31 12:36 Thu

クラスを内包したパッケージを作り、EXE と DLL 双方でそのパッケージを外部リンク (静的リンクではなくパッケージを使用した動的リンク) すれば、RTTI で取れると思うのですが、恐らくそれはお望みの方法ではないと思います。

[パッケージ情報 - 型情報のクエリ (DocWiki)]
http://docwiki.embarcadero.com/RADStudio/ja/%E5%9E%8B%E6%83%85%E5%A0%B1%E3%81%AE%E3%82%AF%E3%82%A8%E3%83%AA#.E3.83.91.E3.83.83.E3.82.B1.E3.83.BC.E3.82.B8.E6.83.85.E5.A0.B1

DEKO
管理者
投稿数: 2691
Re: DLLからEXEの型情報を取得したい
on: 2014/07/31 12:52 Thu

> (でも、最後の人はできるようなこと書いてますが・・・)
IDR は逆コンパイラですから、そこまでやればできなくもないかもしれません。dis.dll が逆コンパイラ本体のようです。
ただ、2010 で更新が止まっているので、XE 以降の EXE を解析できるかどうかは不明です。

ishikawa-tatsuya
モデレータ
投稿数: 5
Re: DLLからEXEの型情報を取得したい
on: 2014/07/31 20:18 Thu

DEKOさん

ありがとうございます。
でも、何らかのヒントになりそうです。
こんなモデルを思いつきました。
テスト時にTestBridge.dll というのをユーザーに作ってもらうという制限を入れる案です。
といっても、これはリフレクション情報をブリッジするだけの役割です。
最初の案より少し面倒ですが、プロダクトのコードをいじる必要がないので、許容範囲です。
まだ、思いつきですので、また実験してみます。

—————————————————
Procuct.exe
 テスト対象

TestBridge.dll
 テスト用にインジェクションするDLL
 ユーザー作成
 これに、Exeの静的情報をリンクしてやる
 FriendlyDelphi.dllもリンクする
 Procuct.exeはこのDLLのことは知らない
 Friendlyでテスト時だけ差し込む
 Product.exeのを型情報をFriendlyDelphi.dllに渡す。

FriendlyDelphi.dll
TestBridge.dllから渡された型情報をもとにリフレクションを実行。

DEKO
管理者
投稿数: 2691
Re: DLLからEXEの型情報を取得したい
on: 2014/07/31 21:02 Thu

らいなタンさんのツイートより。

引用 Lyna on Twitter https://twitter.com/lynatan/status/494794848310816769
@ht_deko DLLから分かるのはエントリポイントだけなんで、そこから力技で辿ってパッケージ情報のポインタを得て…と難しく考えてたら、EXE側も触れる前提なんですねw それならTRttiContext.GetTypeをラップした関数をEXE側でexportすればいけそう…?

 
…だそうです。

DEKO
管理者
投稿数: 2691
Re: DLLからEXEの型情報を取得したい
on: 2014/07/31 21:52 Thu

もう一つ、らいなタンさんのツイートより。

引用 Lyna on Twitter https://twitter.com/lynatan/status/494823892712558593
@ht_deko ああいう用途ならTRttiContextから始まる一連の必要なメソッドを全部ラップ&exportしたユニットをEXE側でusesしてもらった方が使い回しが利きそうな気はしますね。Delphi以外からも呼べますし。

 
…だそうです。

ishikawa-tatsuya
モデレータ
投稿数: 5
Re: DLLからEXEの型情報を取得したい
on: 2014/07/31 22:13 Thu

Lynaさん
DEKOさん

ありがとうございます。

>EXE側も触れる前提なんですねw それならTRttiContext.GetTypeをラップした関数をEXE側でexportすればいけそう…?
それでもいいですね!
テスト目的なので、Exe側に多少の手を加えるのもアリだと思っています。

>DLLから分かるのはエントリポイントだけなんで、そこから力技で辿ってパッケージ情報のポインタを得て
でも、Exeに手を入れずにできたら、その方がいいです。
Exeからexportなしで力技で引っ張る手段もあるのでしょうか?

ページ: [1] 2
WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.047 sec.