0

MIT Kerberos 実装 (k4w-4.0.1 の krb5_32.dll と関連ヘッダー ファイルを使用) を使用して、TGT とサービス チケットを取得しようとしています。

krb5_init_context 関数をロードしました。これは、ヘッダー ファイル、google および SO によると、1 つの引数 (krb5_context 構造体) のみを取り、それを設定します。

#include "stdafx.h"
#include "windows.h"
#include "krb5.h"

typedef int krb5_int32;
typedef krb5_int32 krb5_error_code;

int _tmain(int argc, _TCHAR* argv[])
{    

    HMODULE kerberos = LoadLibrary(L"krb5_32.dll");
    HANDLE krb5_init_context = NULL;

    if(kerberos == NULL)
    {
        printf("Failed to load library!\n");
        printf("%lu", GetLastError());
        return -1;
    }
    else
    {
        printf("Library krb5_32.dll loaded successfully!\n");
    }

    if((krb5_init_context = GetProcAddress(kerberos, "krb5_init_context")) == NULL)
    {
        printf("GetProcAddress for krb5_init_context failed!\n");   
        return -1;
    }
    else
    {
        printf("Function krb5_init_context loaded successfully!\n");
    }

    krb5_context context = NULL;
    krb5_ccache cache = NULL;
    krb5_principal client_princ = NULL;
    char* name = NULL;
    krb5_keytab keytab = 0;
    krb5_creds creds;
    krb5_get_init_creds_opt *options = NULL;
    krb5_error_code error_code = 0; //error_status_ok;

    error_code = (*krb5_init_context)(&context);

    printf("Error Code: " + error_code);

    while(true);


    return 0;
}
4

1 に答える 1

2

ポインターを使用して関数を呼び出すには、関数ポインターを宣言する必要があります。一般に、関数ポインター (静的メンバー、グローバルまたは静的関数) の宣言は次のようになります。

typedef return_type (*alias_name)(argtype_1, argtype_2,...argtype_n);

wherereturn_typeは戻り値の型、 はalias_name関数ポインタ変数を宣言するために使用する結果の名前、arg1type_1, argtype_2,などは関数が受け入れる引数の型です。

あなたの投稿によると、次のkrb5_init_contextように宣言する必要があります(typedef物事を単純化するために使用します):

typedef krb5_int32 (*context_fn)(krb5_context*);  // pointer to function type
contextfn krb5_init_context;  // declare it
//...
krb5_init_context = (context_fn)GetProcAddress(...);  // get the address
//..
krb5_context context; 
krb5_init_context(&context);  // now function can be called

これらの変更の後、エクスポートされた関数として、一致する呼び出し規約で関数ポインターも宣言していることを確認してください。関数が の場合、__stdcallでそれを指定する必要がありますtypedef。これを行わないと、関数がクラッシュします。

呼び出し規約を追加するには (この場合は__stdcall):

typedef krb5_int32 (__stdcall *context_fn)(krb5_context*);  
于 2015-11-16T01:49:19.490 に答える