C ++ Builder — C ++ — Builder: преобразовать в тип stdcall

В настоящее время я пытаюсь портировать старый owl-c ++ — builder-projekt для использования XE2 и owlnext.
В старом файле я мог просто вызвать строку

(FARPROC)LP_I2COpen = GetProcAddress(Hi_I2C, "I2COpen");

В то время как LP_I2Open определяется с

#ifdef WIN32
#define CALLING_CONVENTION  __stdcall
#else
#define CALLING_CONVENTION  far pascal
#endif

int CALLING_CONVENTION (*LP_I2COpen)(HWND hndl,HINSTANCE hInstance, struct I2C_PROP far *ps);

#ifdef _WIN64
typedef INT_PTR (FAR WINAPI *FARPROC)();
#else
typedef int (FAR WINAPI *FARPROC)();
#endif

WINBASEAPI FARPROC WINAPI GetProcAddress(...

Эти кодовые блоки на самом деле из нескольких файлов. Я думал, что этот порядок будет интуитивно понятным.

Теперь у меня есть некоторые трудности, чтобы переписать это по мере необходимости.
Я понимаю, что теперь левая сторона понимается как метод преобразования, возвращающий значение, но не может быть назначен определенному значению, поэтому выдается ошибка «Ожидаемое значение L».
Тем не менее, я не совсем знаю, как преобразовать FARPROC во что-то, что поместится в LP_I2COpen … Попытка без каких-либо преобразований выдает эту ошибку:

[BCC32 Fehler] Dio.cpp(2906): E2034 Konvertierung von 'int (__stdcall *)()' nach 'int (__stdcall *)(HWND__ *,HINSTANCE__ *,I2C_PROP *)' nicht möglich

Итак, кто-нибудь знает, какие ошибки я делаю с этой строкой?

(FARPROC)LP_I2COpen = GetProcAddress(Hi_I2C, "I2COpen");

С Уважением,
юлианский

0

Решение

Приведение l-значений недопустимо, и AFAIK всегда было недопустимо, хотя некоторые компиляторы приняли это. Технически, вы создаете временный тип FARPROC, который затем получает результат GetProcAddress () перед тем, как его отбрасывают. Правильный путь выглядит так:

// function type alias
typedef int CALLINGCONVENTION I2COpenFn(HWND, HINSTANCE, I2C_PROP*);
// read and convert function pointer
I2COpenFn* LP_I2COpen = (I2COpenFn*)GetProcAddress(Hi_I2C, "I2COpen");

Обратите внимание, что такие вещи, как «далеко», устарели. Также обратите внимание, что это приведение в стиле C уродливо, но в любом случае у вас нет безопасности типов, и он изолирован от ограниченного количества кода. Если вы можете, тем не менее, используйте правильные ссылки вместо загрузки DLL во время выполнения.

2

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

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