2009-02-07 58 views
0

我知道在GINA中找到主控並不容易,但我的問題最接近進程間通信(IPC),我在非託管C++中編寫了自定義GINA,我將它包含在一個方法中,以檢查對於用戶指紋的有效嘗試登錄時,該功能將調用一些方法寫在C#中的運行系統窗口服務,代碼如下:登錄方法使用GINA的自定義

在GINA

,在窗口服務託管C++

if(Fingerprint.Validate(userName,finerprintTemplate) 
{ 
    //perform login 
} 

,C#

public class Fingerprint 
{ 
    public static bool Validate(string userName, byte[] finerprintTemplate) 
    { 
     //Preform Some code to validate fingerprintTemplate with userName 
     //and retuen result 
    } 
} 

有誰知道如何做GINA和Windows服務之間的這種通信,或者簡單地在C++寫的服務和C#寫服務之間進行通信。

謝謝

回答

4

與服務通信的規範方法的另一個API替代的(或大多數IPC潛在需要跨會話/桌面界面)是一個命名管道。你也可以使用郵筒,但是你必須處理重複問題,因爲郵筒消息在所有已安裝的協議中都被欺騙了,所以你需要某種標籤系統......變得有點麻煩。

查看CreateNamedPipe的文檔,並從那裏開始工作。我曾經使用過管道在C++和C#之間討論過:interop有點混亂(二進制消息),但它可以。有一些C#管道的示例代碼(來自兩側)here

爲特定服務使用管道來處理通信問題的好處是,如果需要,您可以稍後再擴展設計以支持UI。

+1

唯一需要注意的我想補充關於使用郵筒是因爲它們不是安全的,對於服務間通信而言,這通常是一種破壞行爲。 – 2009-02-07 16:00:50

+0

這就夠了。不是我認爲他應該使用它們,我只是一個狂熱的完美主義者,當談到回答問題時:-) – 2009-02-07 22:01:14

1

我強烈建議您使用命名管道。如果您使用的是.NET 3.5或更高版本,並且從C++方面(包含大量示例)相對容易,它們可以從C#端快速輕鬆地使用。最重要的是通過應用一個簡單的安全描述符非常容易確保安全。

0

我很好奇,如果你按照建議的「答案」,並試圖命名管道路線?根據this link和我自己的經驗,GINA在預先驗證的(Session 0)上下文中運行,並且任何嘗試從非託管C++ GINA dll訪問命名管道都將導致錯誤#5「訪問被拒絕」。

我相信郵筒可能是唯一可用的Windows IPC機制,實際上是可以在這個水平,但我甚至不能肯定,將工作(沒試過。)