[Delphi:90666] 別のログインセッションと共有するには

922 views
Skip to first unread message

K.Kurokawa

unread,
Aug 28, 2008, 5:12:30 AM8/28/08
to Delphiメーリングリスト 投稿
黒川と申します。

プロセス間のメッセージのやり取りや、ミューテックスを利用した排他制御
および共有メモリ(メモリマップドファイル)は大変便利な機能なのですが、
ログインした同一デスクトップ上のやり取りだけの話で、ユーザの切り替え
やリモートデスクトップ接続でログインしたログインセッションが別のデス
クトップとのやり取りを行う方法はないでしょうか?

PCは同一上であっても、ログインセッションが別であると、本当に別のPC
として扱われるようで、システムで一意でなく、セッション毎に一意のような
状態で、メッセージID、ミューテックスのハンドル、共有メモリのハンドル
がセッション毎に別のものが返ってきます。


1.ユーザAでログイン

2. テストプログラムを実行(1つ目)
1つ目のプログラム起動なので、MutexもMMFも新規のハンドルを取得している

Message ID (49546) ←RegisterWindowMessageで取得したメッセージID
Mutex Create(144) ←CreateMutexで取得したハンドル
MMF Create(148) ←CreateFileMappingで取得したハンドル


3.テストプログラムを実行(2つ目)
2つ目のプログラム起動なので、既に作成済みのMutex、MMFをOpenしている

Message ID (49456)
Mutex Open(144)
MMF Open(148)


ここまでは正常なのですが・・・。

4.ユーザの切り替えでユーザBでもログインする

5.テストプログラムを実行(3つ目)
3つ目のプログラム起動なのだが、メッセージIDは新たな番号となり、
Mutex、MMFともハンドルこそ同じなのだが新規に作成してしまっている

Message ID (49453)
Mutex Create(144)
MMF Create(148)

6.テストプログラムを実行(4つ目)
4つ目のプログラム起動は、3つ目のプログラムが取得した内容と同じ
ものを取得している

Message ID (49453)
Mutex Open(144)
MMF Open(148)


上記の結果、セッションが別であっても同一システム上では一意の結果
が返って欲しかったのですが、ユーザ毎(セッション毎)で一意の結果
となってしまいました。
この結果の通り、同一PCであっても、セッションが異なるとメッセー
ジのやりとりや、排他制御、共有メモリのやりとりなどが出来ない状態
なのですが、解決する方法は有りませんでしょうか?

長文になり申し訳ございませんが、アドバイスいただけましたら幸いです。

以上

{以下テストプログラムの内容}
unit UnitMain;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private 宣言 }
MsgID : UINT;
MsgType : String;
hMutex : THandle;
MutexType : String;
hMMF : THandle;
MMFType : String;
public
{ Public 宣言 }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Add(MsgType);
Memo1.Lines.Add(MutexType);
Memo1.Lines.Add(MMFType);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
MsgID := RegisterWindowMessage(PChar('MESSAGE TEST'));
MsgType := Format('Message ID (%d)', [MsgID]);

hMutex := OpenMutex(MUTEX_ALL_ACCESS, False, PChar('MUTEX TEST'));
MutexType := Format('Mutex Open(%d)', [hMutex]);
if hMutex = 0 then begin
hMutex := CreateMutex(nil, False, PChar('MUTEX TEST'));
MutexType := Format('Mutex Create(%d)', [hMutex]);
end;

hMMF := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, PChar('MMF TEST'));
MMFType := Format('MMF Open(%d)', [hMMF]);
if hMMF = 0 then begin
// 共有メモリの作成
hMMF := CreateFileMapping($FFFFFFFF, nil,
PAGE_READWRITE,
0, 128,
PChar('MMF TEST'));
MMFType := Format('MMF Create(%d)', [hMMF]);
end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
CloseHandle(hMutex);
CloseHandle(hMMF);
end;

end.

--------------------------------------
Enjoy MLB with MAJOR.JP! Ichiro, Matsuzaka, Matsui, and more!
http://pr.mail.yahoo.co.jp/mlb/

Hikaru Fukushi

unread,
Aug 28, 2008, 5:31:24 AM8/28/08
to Del...@ml.users.gr.jp
黒川さん、こんばんは。福士と申します。

> ログインした同一デスクトップ上のやり取りだけの話で、ユーザの切り替え
> やリモートデスクトップ接続でログインしたログインセッションが別のデス
> クトップとのやり取りを行う方法はないでしょうか?

ミューテックス名であれば、プレフィックス"Global\"を付加
することで複数ユーザ間で名前が共有されるようです。

CreateMutex 関数
http://msdn.microsoft.com/ja-jp/library/cc429064.aspx

@IT:.NET TIPS Windowsアプリケーションの多重起動を禁止するには? - C# VB.NET Windowsフォーム
http://www.atmarkit.co.jp/fdotnet/dotnettips/145winmutex/winmutex.html


何も試していなくて申し訳ありませんが、参考にしてください。


+=========+=========+=========+=========+=========+=========+=========+
東洋テクニカルシステム株式会社 システム開発部 福士 光
Hikaru Fukushi (Toyo Technical System Inc.)
mailto:fuk...@tts-inc.co.jp
+=========+=========+=========+=========+=========+=========+=========+

K.Kurokawa

unread,
Aug 28, 2008, 9:07:11 PM8/28/08
to Del...@ml.users.gr.jp
福士さん、こんにちは
黒川です。

> ミューテックス名であれば、プレフィックス"Global\"を付加
> することで複数ユーザ間で名前が共有されるようです。

ありがとうございます!
ズバリこれで解決できました。
MMFとMutexについて、もう一度MSDNのマニュアルを読んでみたのですが、
完全に読み落としでした。助かりました。
別のログインセッション間とのメッセージのやりとりについては解決し
ていませんが、もういちどMSDNあたりをよく読んでみたいと思います。

戸田 英夫

unread,
Aug 29, 2008, 2:29:12 AM8/29/08
to Del...@ml.users.gr.jp
戸田@お仕事中です

----- Original Message -----
From: "K.Kurokawa" <kuro_m...@yahoo.co.jp>
To: <Del...@ml.users.gr.jp>
Sent: Friday, August 29, 2008 10:07 AM
Subject: [Delphi:90668] Re: 別のログインセッションと共有するには


> MMFとMutexについて、もう一度MSDNのマニュアルを読んでみたのですが、
> 完全に読み落としでした。助かりました。
> 別のログインセッション間とのメッセージのやりとりについては解決し
> ていませんが、もういちどMSDNあたりをよく読んでみたいと思います。

はるか古に投稿した物ですが、MMF 使う方法です。

----- Original Message -----
From: "戸田 英夫" <hideo...@chugoku.ntt-neo.co.jp>
To: "Delphi ML" <Del...@ml.users.gr.jp>
Sent: Wednesday, May 04, 2005 4:26 PM
Subject: [Delphi:85424] Re: 二重起動からフォーム表示

//--- 削除

> Single program instance using Memory Mapped Files
> http://codecentral.borland.com/ccweb.exe/listing?id=565
>
> MemryMapdFile でプロセス間通信する例にもなりそうです。

---- (-_-)(-_-)(-_-) THE REAL PROGRAMMER (-_-)(-_-)(-_-) ----
At the beach, The Real Programmer is the one drawing flowcharts in the sand.
戸田 英夫 mailto: Hideo...@hiroshima.ntt-west.jp


K.Kurokawa

unread,
Aug 29, 2008, 3:22:23 AM8/29/08
to Del...@ml.users.gr.jp
戸田さん、こんにちは

黒川です。

> はるか古に投稿した物ですが、MMF 使う方法です。

あ、すいません。(^^;;;
MMFとMutexについては福士さんのアドバイスのお陰で、ログイン
セッションが別のデスクトップ上のアプリケーションとの間でも
共有できるようになりました。教えていただきましたサンプルコ
ードは確認させていただきましたが、これは同一のログインセッ
ション上でしか共有できない方法でグローバルにはなっていません。

今解決出来ずに試行錯誤しているのはRegisterWindowMessageで取
得したIDを使って、2つのアプリケーション間でのメッセージの
やり取りは問題なくできるのですが、ログインセッションが別の
デスクトップ上のアプリケーションとの間では、異なるメッセー
ジIDになってしまい、やりとり出来ないのです。
折角MMFを使ってメモリの共有が出来るようになったのですが、
その内容が改変されたなどの通知をするすべがありません(^^;;;
BroadcastSystemMessageのパラメータで、通常だとBSM_APPLICATIONS
パラメータを設定して送信するところを、BSM_ALLDESKTOPSを使う
とひょっとしてと思って試しているのですが、このパラメータ
はSE_TCB_NAME権が必要との事で、このあたりについて調査中です。

戸田 英夫

unread,
Sep 3, 2008, 9:41:39 AM9/3/08
to Del...@ml.users.gr.jp
戸田です、こんばんは

----- Original Message -----
送信者 : "K.Kurokawa" <kuro_m...@yahoo.co.jp>
宛先 : <Del...@ml.users.gr.jp>
送信日時 : 2008年8月29日 16:22
件名 : [Delphi:90670] Re: 別のログインセッションと共有するには


折角MMFを使ってメモリの共有が出来るようになったのですが、
> その内容が改変されたなどの通知をするすべがありません(^^;;;
> BroadcastSystemMessageのパラメータで、通常だとBSM_APPLICATIONS
> パラメータを設定して送信するところを、BSM_ALLDESKTOPSを使う
> とひょっとしてと思って試しているのですが、このパラメータ
> はSE_TCB_NAME権が必要との事で、このあたりについて調査中です。

あっさり TCP/IP で Localhost に対して通信した方が簡単に思えるのは
UNIX で書いていた古い奴だからでしょうね。(^_^ゞ

---- (^_^)(^_^)(^_^) THE REAL PROGRAMMER (^_^)(^_^)(^_^) ----


At the beach, The Real Programmer is the one drawing flowcharts in the sand.

戸田 英夫 mailto:to...@384.jp;hideo...@chugoku.ntt-neo.co.jp

K.Kurokawa

unread,
Sep 4, 2008, 8:12:45 PM9/4/08
to Del...@ml.users.gr.jp
戸田さん、こんにちは

黒川です。

On Wed, 3 Sep 2008 22:41:39 +0900
戸田 英夫 <to...@384.jp> wrote:

> あっさり TCP/IP で Localhost に対して通信した方が簡単に思えるのは
> UNIX で書いていた古い奴だからでしょうね。(^_^ゞ

いや、その通りなんですよ。確かに。(^^;;;
でも今回はTCPとかUDPを使わないで出来ないかな~っと
やってたもんで・・・。ははは。
今んとこはlocalhostにTCP/IPで、って手段に心が折れそうです。(^_^ゞ

Reply all
Reply to author
Forward
0 new messages