Импортированная функция DLL бросает «термин не оценивает функцию, принимающую 1 аргумент» ошибка

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

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

Решение

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

ЬурейеЕ return_type (* псевдоним_имя) (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*);
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]