В настоящее время я пытаюсь портировать старый 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");
С Уважением,
юлианский
Приведение 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 во время выполнения.
Других решений пока нет …