tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルプログラム間の変数やりとり
記事No16623
投稿日: 2021/12/17(Fri) 14:50
投稿者でふぁいあんと
いつもお世話になっております。

vb6で作成したプログラムがあり、pythonに移行中です。
いきなり全部書き換えというのは危険なので
関数単位で、pythonプログラムを作成して分離しています。
その時の変数受け取りなのですが

(1)標準出力
vb6->
Dim WSH As New WshShell
Dim wExec As Object
Set wExec = objSH.Exec(hogehoge.py)
'標準出力を取得
Ret = wExec.StdOut.ReadAll

python(hogehoge.py)->
  print("おわり")

(2)ファイル
vb6->
Ret = Shell(hogehoge.py, 1)
ファイルリード
python(hogehoge.py)->
  ファイルライト

といった感じなのですが、今回の移行部分は
高速に処理するということが要求されるので
ファイル経由では遅いのかなと
また、標準出力では、いちいちコマンドプロンプトがついたり消えたり
なので他の作業に影響が出ます。

対pythonに限った話ではないと思いますが
呼び出し側はvb6、プログラムは同一マシンの前提で
高速に処理できる方法はどのような方法が考えられますか
win32api程度は使えます。

[ツリー表示へ]
タイトルRe: プログラム間の変数やりとり
記事No16624
投稿日: 2021/12/17(Fri) 15:12
投稿者でふぁいあんと
忘れていました。
使っているOSはWin10で
ログオフ状態で動かせればと思っています

[ツリー表示へ]
タイトルRe: プログラム間の変数やりとり
記事No16625
投稿日: 2021/12/20(Mon) 15:11
投稿者魔界の仮面弁士
> 呼び出し側はvb6、プログラムは同一マシンの前提で
> 高速に処理できる方法はどのような方法が考えられますか
> win32api程度は使えます。

VB 側で API 宣言不要なプロセス間通信としては
DDE という手があるのですが、これは高速通信には向かないですね。

ActiveX が使えるならば COM サーバーを使う手がありますが(VB6 付属の Coffee2 サンプル)
Win32 API ベースなら、ネームドパイプ(名前付きパイプ)か
シェアードメモリ(共有メモリ)・メモリマップドファイルなどが有名どころです。
その他ソケットを使う方法もありますが、自分はあまり使ったことがありません。
https://docs.microsoft.com/ja-jp/windows/win32/ipc/named-pipes

メッセージを回せる相手の場合は、hWnd に対してウィンドウメッセージを飛ばす手法もあります。
http://chokuto.ifdef.jp/advanced/copydata.html

[ツリー表示へ]
タイトルRe^2: プログラム間の変数やりとり
記事No16626
投稿日: 2021/12/24(Fri) 19:08
投稿者でふぁいあんと
魔界の仮面弁士様 お返事ありがとうございます。

> Win32 API ベースなら、ネームドパイプ(名前付きパイプ)か
> シェアードメモリ(共有メモリ)・メモリマップドファイルなどが有名どころです。

こちらの回答をいただき、
名前付きパイプがいけそうなのでは?
と思い、Vb6<->vb6にてテストしていますが、
4日間かけても、全然動きません。
webも検索したのですが、
readfile?なんでファイルが出てくる?といった感じで
動作しません。

概要だけでもお聞きしたいのですが、
(1) CreateNamedPipe は、文字列の提供側でも受け取り側でも使えるのでしょうか
 
(2) CreateNamedPipeは受け取り側で実行した方がよいと思うので
文字列の受け取り側、受信側
Hpipe = CreateNamedPipe
Ret = ConnectNamedPipe(hPipe, 0)
Ret = ReadFile(hPipe
文字列の提供側、送信側
hPipe = CreateFile
Ret = WriteFile(hPipe,
としております。(細かいパラメーター、クローズ処理は略)
これでよいのでしょうか。

peekNamedPipeなんていう関数もありReedFileとの関係がよくわかりません

[ツリー表示へ]
タイトルRe^3: プログラム間の変数やりとり
記事No16627
投稿日: 2021/12/28(Tue) 17:22
投稿者でふぁいあんと
自己レスです。なんとか動きました。
いろいろ調べまして、名前付きパイプのクライアント側、サーバー側というのが
どうにも理解できないので、、、

vb6:文字列の受信側-----------
hPipe = CreateNamedPipe(txtPipeName.Text, _
            PIPE_ACCESS_DUPLEX, _
            PIPE_WAIT Or _
            PIPE_READMODE_MESSAGE Or _
            PIPE_TYPE_MESSAGE, _
            PIPE_UNLIMITED_INSTANCES, _
            RECV_MAXLENGTH, _
            RECV_MAXLENGTH, _
            1, _
            udtSecurityAttributes)


'Ret = ConnectNamedPipe(hPipe, 0)

strbuf = string(255," ")

  For I = 1 To 2000
  Ret = ReadFile(hPipe, ByVal strbuf, LenB(strbuf), lngNumberOfBytesRead, 0)
    If Left(strbuf, 1) <> " " Then
    Exit For
    End If
  Sleep 1000
  Next

Ret = CloseHandle(hPipe)

python側:文字列の送信側---pythonはこの掲示板の趣旨ではないので要約です。

handle = win32file.CreateFile(,,,
word = "<print>日本語</print>"
senddata = word.encode("sjis")
win32file.WriteFile(handle, senddata)

●受信側で、CreatePipeしても問題は無い
●受信側の CreatePipeのタイプアウトパラメータは効かないようで、
 ConnectPipeで送信を待つと送信側がトラブった場合に固まります。
 なのでConnectPipeは使わずに直接ReadPipeしていますが、
 ReadPipeして、ループ初回に何かデータを受信できれば問題ないですが、
 なにも来ない場合は、同じように固まります。
 この辺、何かアイデアはないかなあと検討しています。

[ツリー表示へ]