2015-11-16 4 views
0

Я пытаюсь использовать реализацию MIT Kerberos (используя krb5_32.dll из k4w-4.0.1 и связанный файл заголовка), чтобы получить билет TGT и Service.Импортированные функции DLL-функции «термин не оценивает функцию, принимающую 1 аргумент» error

Я загрузил функцию 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; 
} 
+0

'krg5_init_context' является HANDLE, это не указатель на функцию. Если вы хотите, чтобы он был указателем функции, объявите его как единое целое. – PaulMcKenzie

+0

Итак, глядя на этот https://msdn.microsoft.com/en-us/library/64tkc9y5.aspx и некоторые другие страницы, я думал, что это должен быть дескриптор? Могу ли я просто назначить указатель на результат «GetProcAddress» вместо этого? – T3CHN0CR4T

+0

См. Мой ответ. «РУЧКА» является общей. Вам нужно передать возвращаемое значение указателю функции. – PaulMcKenzie

ответ

2

Чтобы вызвать функцию с помощью указателя, вы должны объявить указатель на функцию. В общем, указатель функции (статический член, глобальные или статические функции) заявление выглядит следующим образом:

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

где return_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*); 
+0

'typedef krb5_error_code (* context_fn) (& krb5_context);' дает 'krb5_context: Недопустимое использование этого типа в качестве выражения.' – T3CHN0CR4T

+0

По-прежнему получается стек ошибок из typedef. 'Ошибка: 'krb5_context': незаконное использование этого типа в качестве выражения', 'Ошибка: 'krb5_context': незаконное использование этого типа в качестве выражения', Ошибка: 'krb5_int32 *': переменная, объявленная до '=' 'и т. Д. – T3CHN0CR4T

+0

Каков точный прототип функции, которую вы вызываете? Я размещаю то, что вы описываете, поэтому я думаю, вам нужно опубликовать из файла заголовка * точный * прототип. Кроме того, где вы размещаете этот 'typedef'. Это до 'krb5_context', и все эти другие псевдонимы определены? Если это так, то, конечно, вы получите ошибки. – PaulMcKenzie

 Смежные вопросы

  • Нет связанных вопросов^_^