VB6でユーザー認証をおこなうクラスを作成しました。
PC起動中は、認証を1度だけにしたいのですが、
ファイルやレジストリやDBに認証ステータスを保存せずに
認証済かどうかを判断する方法がわかりません。
私のイメージは、
あるアプリ起動時にユーザー認証クラスをインスタンス化し、
別のアプリ起動時に既にインスタンス化されたユーザー認証クラスがあり、
かつ、そのインスタンスの認証要求済プロパティがTrueの場合は、
認証要求をスルーする
ような感じです。
方法または参考ページをご存知のかたがいらっしゃいましたら、
ご教授いただきたいと思います。
よろしくお願いします。
ファイルが簡単そうだけど、セキュリティに問題が有るのかな。
両方のアプリが起動されているのであれば、
Dllで、#pragma data_segを使ってグローバル変数を
宣言する方法が一番簡単かな。
> Dllで、#pragma data_segを使ってグローバル変数を
> 宣言する方法が一番簡単かな。
#pragma data_segってCなんですね・・・無理です。
で、
自分でアレコレ調べてみてたんですが、
キーワード的に、ActiveX.exeを使うのかなぁ?
と思い試してみたんですが、ダメだした。
ActiveXTest.exe
└ ClassTestクラス
└aaaプロパティ ・・・Getする度にPublic変数 bbbに1を加算し返す。
を作り、
アプリMから
Set o1 = CreateObject("Project1.Class1")
Msgbox o1.aaa ⇒ 1を表示
Msgbox o1.aaa ⇒ 2を表示
でMは終了せず待機。
アプリNから
Set o1 = CreateObject("Project1.Class1")
Msgbox o1.aaa ⇒ 1を表示
アプリNから、3を表示させたいのですが、
どうしたら表示できるのでしょうか?
これができれば、夢は叶うと思います。
よろしくお願いします。
わざわざActiveX.exeの中で、CreateObjectしたら、インスタンス
が違う(メモリ空間が違う)ものが起動するので、結果的に相違
することになります・・・
ActiveX.exe内で直接行うか・・・
メモリ上で行うのを止めて、ファイルに連番をカウントさせて、
管理するとか・・・
ファイルの排他制御は必要になると思いますが。
※ 一番簡単なのはやはり、C言語でデータセグメントの共有
を宣言する方法なのですが・・・
MFCでActiveX.exe作成すれば簡単なんですが。
以上。
こんなのは。
プログラム A
Option Explicit
Private Declare Function FindWindowA Lib "user32" _
(ByVal cnm As String, ByVal cap As String) As Long
Private Sub Command1_Click()
Dim hWndHoge As Long
hWndHoge = FindWindowA(vbNullString, "hogehoge2" + " ")
If hWndHoge <> 0 Then
MsgBox ("認証が既に行われています。")
Else
'認証手続きをする
End If
Me.Caption = "hogehoge1" + " "
End Sub
プログラム B
Option Explicit
Private Declare Function FindWindowA Lib "user32" _
(ByVal cnm As String, ByVal cap As String) As Long
Private Sub Command1_Click()
Dim hWndHoge As Long
hWndHoge = FindWindowA(vbNullString, "hogehoge1" + " ")
If hWndHoge <> 0 Then
MsgBox ("認証が既に行われています。")
Else
'認証手続きをする
End If
Me.Caption = "hogehoge2" + " "
End Sub
認証を取得したら自分のキャプションに空白を追加しておき、起動時に
空白が追加された相手のキャプションのハンドルが取得できたら認証済みとする。
空白の代わりに[認証済み]としてもいいが。
アドバイスありがとうございました。
我龍院さんの手法はユニークで良いのですが、
後でメンテする人になかなか伝えにくいのが
ツラいです。
諦めてファイルにします。
ありがとうございました。
ツイート | ![]() |