認証要求を1度だけにしたい


ツルマルボーイ  2008-07-28 20:52:41  No: 100953

VB6でユーザー認証をおこなうクラスを作成しました。

PC起動中は、認証を1度だけにしたいのですが、
ファイルやレジストリやDBに認証ステータスを保存せずに
認証済かどうかを判断する方法がわかりません。

私のイメージは、
あるアプリ起動時にユーザー認証クラスをインスタンス化し、
別のアプリ起動時に既にインスタンス化されたユーザー認証クラスがあり、
かつ、そのインスタンスの認証要求済プロパティがTrueの場合は、
認証要求をスルーする
ような感じです。

方法または参考ページをご存知のかたがいらっしゃいましたら、
ご教授いただきたいと思います。

よろしくお願いします。


我龍院  2008-07-29 01:57:45  No: 100954

ファイルが簡単そうだけど、セキュリティに問題が有るのかな。
両方のアプリが起動されているのであれば、
Dllで、#pragma data_segを使ってグローバル変数を
宣言する方法が一番簡単かな。


ツルマルボーイ  2008-07-29 04:04:59  No: 100955

> 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を表示させたいのですが、
どうしたら表示できるのでしょうか?

これができれば、夢は叶うと思います。

よろしくお願いします。


オショウ  2008-07-29 06:12:15  No: 100956

わざわざActiveX.exeの中で、CreateObjectしたら、インスタンス
が違う(メモリ空間が違う)ものが起動するので、結果的に相違
することになります・・・

ActiveX.exe内で直接行うか・・・
メモリ上で行うのを止めて、ファイルに連番をカウントさせて、
管理するとか・・・

ファイルの排他制御は必要になると思いますが。

※  一番簡単なのはやはり、C言語でデータセグメントの共有
    を宣言する方法なのですが・・・
    MFCでActiveX.exe作成すれば簡単なんですが。

以上。


我龍院  2008-07-29 17:53:55  No: 100957

こんなのは。

プログラム  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

認証を取得したら自分のキャプションに空白を追加しておき、起動時に
空白が追加された相手のキャプションのハンドルが取得できたら認証済みとする。
空白の代わりに[認証済み]としてもいいが。


ツルマルボーイ  2008-07-29 19:33:27  No: 100958

アドバイスありがとうございました。

我龍院さんの手法はユニークで良いのですが、
後でメンテする人になかなか伝えにくいのが
ツラいです。

諦めてファイルにします。

ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加