Я вызываю DLL из C, но когда я вызываю GetProcAddress, GCC говорит:

warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]

DLL принимает указатель на двойной массив и возвращает указатель на двойной массив. Вот соответствующая часть кода C:

typedef double* (*dllfunc1)(double*);
double *return_pointer;

hinstLib = LoadLibrary(dllname);
dll_handle = GetModuleHandle(dllname);
return_pointer = (dllfunc1)(GetProcAddress(dll_handle, "Main_Entry_fn"));

Последняя строка - та, которая терпит неудачу. Я пробовал несколько разных перестановок, но ни одна из них не сработала. В сети довольно много информации о прототипах typedef для указателей на функции, но очень мало информации в контексте GetProcAddress для вызова функции DLL.

Когда я меняю определение return_pointer на:

int return_pointer

Я получил:

warning: assignment makes integer from pointer without a cast

Похоже, проблема в переменной return_pointer. Скорее всего, его нужно определить как int и преобразовать в указатель, но я не смог преобразовать его в указатель. Исходное определение (* double) было связано с тем, что оно возвращает указатель на массив double.

Где я ошибаюсь? Мы будем очень благодарны за любые идеи. Спасибо.

2
RTC222 15 Фев 2018 в 01:49

1 ответ

Лучший ответ

Я считаю, что ваш код должен быть таким:

typedef double *(*dllfunc1)(double *);

HANDLE dll_handle = LoadLibrary(dllname);
dllfunc1 Main_Entry_fn = (dllfunc1)(GetProcAddress(dll_handle, "Main_Entry_fn"));

double *result = Main_Entry_fn(argument);

dllfunc1, который является типом указателя на функцию, является правильным типом для переменной указателя на функцию, которая будет содержать указатель, возвращаемый GetProcAddress. double * - это просто тип указателя, возвращаемого Main_Entry_fn, так что это правильный тип для переменной, которая содержит результат фактического вызова Main_Entry_fn.

Кроме того, если я правильно читаю MSDN, вам не нужно вызывать одновременно LoadLibrary и GetModuleHandle; того или другого достаточно.

Кроме того, будет менее запутанно, если вы назовете указатель на функцию после функции, которую ищете, по имени.

Кроме того, звездочки-указатели привязываются к правой стороне, поэтому никогда не прижимайте их к левой стороне, даже если вы пишете на C ++.

3
zwol 15 Фев 2018 в 02:20