質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

Delphi

DelphiはPascalを拡張してオブジェクト指向を導入したWindows, OS X,iOS,Androidのネイティブアプリケーションを開発するための言語です。旧称はObject Pascal。開発用IDE「Delphi」にあわせ現在の名前に改称されました。

DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

3935閲覧

.NET系プログラムからDelphi7製プログラムのイベントを起こしたい

take7

総合スコア5

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

Delphi

DelphiはPascalを拡張してオブジェクト指向を導入したWindows, OS X,iOS,Androidのネイティブアプリケーションを開発するための言語です。旧称はObject Pascal。開発用IDE「Delphi」にあわせ現在の名前に改称されました。

DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2020/02/13 02:02

前提・実現したいこと

VB.NET もしくは C# から既に起動しているDelphi7のプログラムに
アクションを起こしDelphi7のイベントを実行させたい。

もしくは、Delphi7のプログラムで特定のファイルやメモリ領域が変更
されたことを察知し、変更されたと同時に実行されるトリガーのような
ものを作成したい。

具体的には、とあるメーカーが提供しているDLLがDelphi7に対応して
おり、今まではDLLを通してDlehpi7のイベントを直接起こして値を
セットしていたのですが、バージョンアップとともにDLLがDelphi7へ
の対応を無くして、NET系のプログラムのみになってしまったため、
DLLからNET系プログラムに渡った情報を即座にDelphi7のプログラム
へ渡す方法を模索しております。

条件

Delphi7は起動している状態です。

今はVB.NETからテキストに書き出してDelphi7のプロセスを一度kill
してから再度起動し、起動時点でDelphi7がテキストの内容を読み込む
ことで実現しておりますが、これだとサブ画面との親子の関係が切れて
しまったりと不都合があるためこの方法以外を探しています。

VBのプログラムは自由に書き換え可能です。

Delphi7のプログラムも書き換え可能ですが総コード量的にNET系のプロ
グラムへの置換やDlehipi自体のバージョンアップは難しいです。

調べたこと

Delphi7の方でUDPかTCPの特定ポートで待ち受けるスレッドを作成して、
VB.NETからlocalhostの特定ポートにデータを送ることでDelphi7の
イベントを実行できないか。

Delphi 素朴なソケット通信をしたい
https://qiita.com/himajin_sekky/items/ffd5c5c854328287ed2d

Delphi XEのフォルダ監視コンポーネントを利用できないか。

Delphi Programming / Object Pascal
http://mrxray.on.coocan.jp/Delphi/plSamples/815_FolderWatcher.htm

あいにくこういった.NETとDelphiなどの異種類でのプログラム連携の作法に乏し
く上記のような方向性で実行していいかも判断しかねる状況です。

何か他にいい方法や上記の方法で実装しているケースなどありましたらアドバイス
いただけると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KoichiSugiyama

2020/02/13 03:48

Delphiはあまり詳しくないのですが、調べる限りDelphi8から.net Framework対応となっているみたいですので、それまではSendmessage/PostMessageもしくはCOMのイベントで動いていたのではないかと推測されます。そのあたり、実際に使用していたイベント名やイベントを処理している個所のコードを一部でも記載できないでしょうか。現状だと手掛かりが少なすぎて、アドバイスが集まらないのではないかと思います。
Zuishin

2020/02/13 08:48 編集

Windows であれば .NET で COM 公開し、それを Delphi 側で使うのが一番簡単なんじゃないかなと思います。ただし Delphi7 から COM を扱うのが難しければその限りではありません。さすがに 20 年近く前のバージョンなので、バージョンアップした方が情報が集まりやすいのではないかと思います。 COM 以外であれば名前付きパイプや IPC チャネルなどプロセス間通信の方法はいくつかありますが、ポートを一つ使うのさえ気にしなければ TCP/IP 通信はありです。この場合は TCP/IP サーバーが一つ立つことになるので、外部に公開しないよう気を付けてください。
take7

2020/02/13 09:54

>>KoichiSugiyama 様 確認致しましたDelphi7のコンポーネントを使用しているようです "TDdeServerConv" の "OnExecuteMacro" や"OnOpen" イベント "TDdeServerItem" の "OnChange"イベント等 >>Zuishin 様 ありがとうございますCOMでも少し調べてみます。 名前付きパイプについてはDelphiも使える方法があるようなのでサンプルを探して試せるようなら試してみようかと思います ちなみにWindows10です。 > TCP/IP サーバーが一つ立つことになるので、外部に公開しないよう気を付けてください。 ありがとございます。こちらの設定を使用する際はファイアーウォールの設定などを含めて調査致します。
guest

回答3

0

解決済みとなっていますが、情報として追記します。

Windowsの場合、双方プログラム書き換え可能で「単純なトリガーだけでよい」なら
Windowメッセージ送信(WindowsAPIのSendMessage)が一番楽ではないでしょうか?

Delphi7側にウィンドウが無いプログラムでも AllocateHWnd を利用すればメッセージ受け取り可能です。
(メッセージIDは異なるプログラム間なのでRegisterWindowMessageを利用する)


追記1

.net側から送信先ウィンドハンドルを見つけるには WindowsAPIのFindWindow を使用します。
受信ウィンドウのタイトルに GUIDを文字化した物をセットしておくと見つけやすいです。

プログラムが単体起動のみなら、GUIDを決め打ちして良いと思います。
複数起動するなら、GUIDを毎回生成し、Delphi7プログラム起動時のコマンドラインで渡すと重複を避けられます。


追記2

と、ここまで書いておいて 追記・修正欄にTDdeServerConv等の記述があるのに気づきました・・・
単純にいままで通りDDE通信で連携できないのでしょうか?(DDEは古代から伝わるアプリケーション間通信機能です)
私は.netでDDE使用経験はないのですが、検索すると直接WindowsAPIを使用しなくても良いライブラリ(NDde等)あるようです。

投稿2020/03/03 09:03

編集2020/03/03 10:25
FKD

総合スコア268

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2020/03/03 09:10

ウィンドウハンドルを伝える(あるいは探す)のが面倒になるかもしれませんが、確かに、SendMessageあるいはPostMessageも簡易な方法で良いですね。SendMessageは送った先がハングアップすると戻ってこない場合がある(<これも作り次第ですが)ので、PostMessageの方が安全かもしれません。
FKD

2020/03/03 09:25

おっしゃる通りです。確かにPostMessageの方が安全です。 また、ウィンドウハンドルをやり取りする部分に言及しないと、情報として不完全でしたね・・・ 追記いたします。
guest

0

ベストアンサー

例えばファイルの変更を監視するようなことで目的を達せられるのであれば、Windows APIではFindFirstChangeNotification、.NET ではSystem.IO.FileSystemWatcherが使えます。ファイル経由でデータをゆっくり(いや、人間が感じるに充分速いと思いますけど)やり取りするのであれば、比較的簡単にイベント送受とすることができるでしょう。ただ、タイミングによって変更通知漏れのようなことも起きることがあるので、厳密性を求められるのであれば少し注意した方が良いかもしれません。

もう少し一貫性をもってイベント監視を行いたいのであれば、ミューテックス(Mutex)オブジェクトが使えると思います。相互に同じ名前のミューテックスを監視して、変更を起こした方がSetEvent相当のAPIを実行してイベント発火すれば、監視している方に通知されます。

あとは実際にプロセス間で通信経路を確保する名前付きパイプ(NamedPipe)などもありますが、どちらかがサーバー側にならなければならないので、少し面倒でしょう。TCPやUDPは、ポート番号に少し気を付ける必要がありますし、UDPのようにデータグラム的な送受で良ければ、WindowsのネイティブAPIで使える「メールスロット」もあります。データをやり取りする必要が無いのであれば、過剰スペックかもしれません。

投稿2020/02/13 08:42

編集2020/02/13 08:44
dodox86

総合スコア9254

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

take7

2020/02/13 10:05

名前付きパイプ(NamedPipe)についてはもう少し確認してみます。 「メールスロット」というのは初めて聞くことばなので少し調べてみますね。 ありがとうございます。
dodox86

2020/02/13 10:20

メールスロットはかなり前からWindowsがネイティブで持っている機能ですが、使われているのはほとんど見たことは無いですね。質問者さんの要件であれば、私だったら恐らくイベント通知用としてはミューテックスを最初に使ってみることを検討します。データが必要であれば、共有メモリも使うかもしれません。(推している訳ではありません)
guest

0

私はDelphi7触れたことないので的外れな回答かもしれませんが
Delphi7で特定のファイルやメモリ領域の変更分かればいいですかね。
Delphi XEまったく別ものでしたらダメなんですが。

1. ファイルサイズやメモリー取得してますね
http://mrxray.on.coocan.jp/Delphi/plSamples/202_LimitedMemoryDataSize.htm
202_プロセスで使用可能なメモリ量やデータサイズ等

プロセスで使用可能なメモリ量やデータサイズ等
01_プロセス (プログラム) で使用可能なメモリ量
02_読み込むデータ量の制限
03_ファイルサイズを GetFileSizeEx 関数で取得
04_ファイルのサイズを TFileStreamで取得
05_テキストファイルの行数を FileSystemObject で取得
06_テキストファイルの行数を TextFile オブジェクトで取得

473_メモリの使用状況を表示

2.こちらも Delphi XEですね
http://www2.big.or.jp/~osamu/Delphi/Tips/key.cgi?key=0#0213.txt
Delphi Tips

● 09/09 UDP 通信で NoParam ???
● 02/08 Delphi/CBuilder で作った DLL から VB に文字列を返す
● 02/08 任意の実行ファイルが DLL などからインポートしている関数の一覧を得る

2.??です
https://www.codeproject.com/Questions/1248633/How-to-use-a-DLL-I-created-in-VB-NET-in-a-delphi-a
VB.NETで作成したDLLをデルファイアプリで使用する方法

投稿2020/02/13 08:00

編集2020/02/13 08:15
sinzou

総合スコア392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

take7

2020/02/13 10:04

>>sinzou 様 情報ありがとうございます。 確認してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問