Re^2: 複数起動時の処理について

投稿者: 投稿日:2019/11/19(Tue) 22:40:01 No.2526

 こんばんは。

 サンプル試してみました。
 こちらでもうまく動作しています。
 よろしければどのように実装したのか、教えていただけないでしょうか。

 それでは。

Re: 複数起動時の処理について

投稿者:アーク <info.nds.laboratry あっとまーくgmail.com> 投稿日:2019/11/18(Mon) 07:44:32 No.2525

おはようございます。アークです。

既に解決済みかも知れませんがADSによる方法を試してみました。
ウィンドウメッセージでもそうですが通常、
送出する側は受け取る側の状況を考慮しないので、
受け取ったデータを保管する入れ物を用意しました。
使う時は此処から一つずつ取り出して使います。
入れ物は使い終わると空になります。
当方の環境では問題無く機能していますが、
陸さんが希望する条件に合致するかは分かりません。

もう一つ疑似ウィンドウメッセージ方式のも作ってみました。
こちらも問題無く機能しています。
動作確認用のサンプルを下記に積みました。

https://ux.getuploader.com/reg_mem/download/263

Re: 静的メソッドの呼び出しではインスタンスは不要です

投稿者:schutzen 投稿日:2019/11/17(Sun) 00:07:21 No.2524

ゆうとさん、早速のご返答ありがとうございます。調べてみましたら、基本的な所が理解できていなかったようで、お恥ずかしいです。

もう一つ質問よろしいでしょうか。
教えていただいた方法で生成したImage型のプロパティの取得やメソッドの呼び出しを試みています。例えば、
--------
ファイル文字列=「test.jpg」
dotnet_imageというドットネット型(「System.Drawing.Image」)を作る
imgは、dotnet_imageから「FromFile」を{ファイル文字列}で呼び出す
imgから「PropertyItems」を取得する
imgから「GetPropertyItem」を{271}で呼び出す
--------
では、最後の2行が「手順が複数あり、どの手順を実行するか決定できません。」でエラーになります。
自分なりに調べたところ、Image型オブジェクト≒プロデルの画像のBaseObjectと思われたのですが、ドットネット型の「取得する」、「設定する」は使えず、Image型オブジェクトのメンバーにアクセスするコードを書く必要があるのでしょうか。

静的メソッドの呼び出しではインスタンスは不要です

投稿者:ゆうと 投稿日:2019/11/15(Fri) 16:31:20 No.2523

こんにちは ゆうとです。

ImageクラスのFromFileメソッドは、静的メソッドですのでドットネット型の「呼び出す」手順を使って呼び出します。
次のような感じでImage型のインスタンスを作ることができます。
----------------
ファイル文字列=「F:\test.jpg」
dotnet_imageというドットネット型(「System.Drawing.Image」)を作る
imgは、dotnet_imageから「FromFile」を{ファイル文字列}で呼び出す
----------------

参考にして下さい。

Re^2: 私にできるのは…

投稿者:アーク <info.nds.laboratry あっとまーくgmail.com> 投稿日:2019/11/14(Thu) 21:55:37 No.2522

こんばんは。アークです。

「メモリマップドファイル」には2種類あるようです。
そのまま消えてしまうタイプと終了時にファイルに残すタイプです。
まぁ、ファイルを使いたくないという事であれば残るは「ADS」辺りでしょうか。

Re: 私にできるのは…

投稿者: 投稿日:2019/11/14(Thu) 21:19:41 No.2521

 こんにちは。

 クリップボードはちょっと使えないですね。
 そもそもすでに何かしらデータが入っていたら、クリップボードの中身が上書きされてしまうので。
 クリップボードに入っているのが文字列とか画像とかだけなら、1回バックアップして、書き戻すこともできるかもしれないですが、ファイルがコピーされていたりすると、かなりめんどうなことになるので。
 それなら一時ファイルを経由させる方がまだましだと思います。

> 本格的なプロセス間通信を実装するのなら「メモリマップドファイル」を使って、
> プロセス間で共通に使える変数を利用するのが良さそうです。
> 陸さんはCを遣られているので如何でしょうか。

 これも試してみました。
 ほぼほぼ要求は達成できましたが、1つ問題があって、メモリに書き込んだ側のプログラムが終了されてしまうと、書き込んだデータは読み込めなくなってしまいます。
 タイマーで定期的に監視しても、多分取得漏れが発生すると思います。

 それでは。

ドットネット型のインスタンス

投稿者:schutzen 投稿日:2019/11/14(Thu) 16:34:48 No.2520

こんにちは。いつもお世話になっております。
エクスプローラーでjpeg画像の詳細プロパティに表示されるタグを、プロデルから編集しようとしています。
https://social.technet.microsoft.com/Forums/scriptcenter/en-US/8b398413-0728-4a8a-a593-d2e8b92b88f2/editing-image-exif-tags?forum=ITCG などのPowerShellの例を参考に、以下のように書いてみました。
-------
ファイル文字列は=「F:\test.jpg」
dotnet_imageというドットネット型(「System.Drawing.Image」)を作る
Imageは、dotnet_imageからインスタンスを作ったもの
imgは、dotnet_image:Fromfile(ファイル文字列)
-------
これを実行すると、3行目で次のようなエラーが出てしまいます。
-------
には、該当するコンストラクタがないためオブジェクトを作成できません。

[エラー番号900] [はじめ:32行目]
-------

そこで、少し書き直して、
-------
ファイル文字列は=「F:\test.jpg」
dotnet_imageというドットネット型(「System.Drawing.Bitmap」)を作る
imgは、dotnet_imageから「Bitmap」を{ファイル文字列}で呼び出したもの
-------
として実行してみると、次のようなエラーが返ってきました。
-------
発生した例外:
dotnet_imageから「Bitmap」を{ファイル文字列}で呼び出したもの(StaticCallExpression)
-------

インスタンス生成がうまく行っていないように思われるのですが、この場合どのように書けばよいのでしょうか。よろしくお願いいたします。

私にできるのは…

投稿者:アーク <info.nds.laboratry あっとまーくgmail.com> 投稿日:2019/11/14(Thu) 10:26:09 No.2519

こんにちは。アークです。

二重起動を防止しつつ、既に起動しているプロセスにファイル名等を渡すだけなら一応可能です。
ウィンドウメッセージは送出するよりも受け取り方のが難しそうです。
標準出力を利用する方法はタイミングが難しそうです
環境変数を利用する方法は一度プロセスを再起動しないと反映されないようです。
本当はプロセス間で共通に使える変数が有ると良いのですが…。

取り敢えずクリップボードを利用して実現してみました。
ファイル名は「TestApp.exe」としました。
-----------------------------------------------------------
もしプログラムの起動時設定が「」でないなら
  引数は、プログラムの起動時設定
  第一引数は、引数(1)
そうでないなら
  第一引数は、「」
もし終わり
一覧は、「TestApp」のプロセス一覧
インスタンス数は、一覧の個数

クリップボードをクリアする
「[第一引数]」をクリップボードへコピーする

もしインスタンス数=1なら
  メイン画面を表示する
  待機する
そうでないなら
  一覧を要素にそれぞれ繰り返す
    もし要素のタイトルが「」でないなら
      要素へ切り替える
    もし終わり
  繰り返し終わり
  終了する
もし終わり

メイン画面とは
  ウィンドウを継承する
  はじめの手順
    初期化する
    ーー貼り付けた部品に対する操作をここに書きます
  終わり
  初期化する手順
  ーー自動生成された手順です。ここにプログラムを書き加えても消える場合があります
  この実質大きさを{408,125}に変える
  この内容を「メイン画面」に変える
  初期化開始する
  テキスト1というテキストを作る
    その位置と大きさを{12,25,380,19}に変える
    その移動順を3に変える
  ボタン1というボタンを作る
    その位置と大きさを{154,72,85,32}に変える
    その内容を「全て終了」に変える
    その移動順を1に変える
  初期化終了する
終わり
  
  開いた時の手順
    テキスト1の内容を「[第一引数]」に変える
  終わり

  ボタン1がクリックされた時の手順
    一覧を要素にそれぞれ繰り返す
      終了する
    繰り返し終わり
  終わり
  
  引数を更新する時の手順
    ファイルパスは、クリップボードの内容
    もしファイルパスが「」でないなら
      テキスト1の内容をファイルパスに変える
      クリップボードをクリアする
    もし終わり
  終わり

  アクティブ時の手順
    引数を更新する
  終わり
終わり
-----------------------------------------------------------
薦められる方法では有りませんが一応引数の内容を渡せます。

本格的なプロセス間通信を実装するのなら「メモリマップドファイル」を使って、
プロセス間で共通に使える変数を利用するのが良さそうです。
陸さんはCを遣られているので如何でしょうか。

Re^2: 複数起動時の処理について

投稿者: 投稿日:2019/11/13(Wed) 21:01:22 No.2518

 こんにちは。

 そういうことです。
 メディアプレイヤーソフト(WindowsMediaPlayerとか)をイメージしていただくとわかりやすいかと思います。

 それでは。

Re: 複数起動時の処理について

投稿者:アーク <info.nds.laboratry あっとまーくgmail.com> 投稿日:2019/11/12(Tue) 23:46:41 No.2517

こんばんは。アークです。

例えば、バッチファイル1の内容が「start /b TestApp.exe "X:\MyApp\新規1.txt"」で、
バッチファイル2の内容が「start /b TestApp.exe "X:\MyApp\新規2.txt"」だったとして、
それを順番に起動したら多重起動しないでテキストのパス名だけがTestApp.exeに渡される、
という理解でよろしいでしょうか。

▲ページの先頭へ

- WebForum -