Теперь, конечно, компилятор жалуется пытаюсь бросить пустые данные * к функции указателю
Моим компиляторы не жалуются вообще с кодом (опять же, я не есть предупреждения, зависающие - я использую более или менее варианты по умолчанию). Это с множеством компиляторов от MS, GCC и других. Можете ли вы дать более подробную информацию о параметрах компилятора и компилятора, которые вы используете, и о том, какое именно предупреждение вы видите?
Тем не менее, C не гарантирует, что указатель функции может быть отброшен в/из указателя void без проблем, но на практике это отлично работает в Windows.
Если вы хотите что-то совместимое со стандартами, вам нужно будет использовать указатель функции «generic» вместо указателя void - C гарантирует, что указатель функции может быть преобразован в любой другой указатель функции и обратно без потерь, поэтому это будет работать независимо от вашей платформы.Вероятно, поэтому возвращаемое значение API Win32 GetProcAddress()
возвращает FARPROC
, что является просто typedef для указателя функции на функцию, которая не принимает никаких параметров (или, по крайней мере, неопределенных параметров), и возвращает int int. Что-то вроде:
typedef INT_PTR (FAR WINAPI *FARPROC)();
FARPROC
бы идея Win32 в о «родовой» указатель на функцию. Таким образом, все, что вам нужно нужно сделать, это иметь такой же ЬурейеЕ (если вы не хотите использовать FARPROC
по какой-то причине):
typedef intptr_t (*generic_funcptr_t)(); // intptr_t is typedef'ed appropriately elsewhere,
// like in <stdint.h> or something
int GenericLoad(char* lib, generic_funcptr_t* Address, char* TheFunctionToLoad)
generic_funcptr_t Address;
GenericLoad("kernel32.dll", &Address, "UnmapViewOfFile");
LoadedUnmapViewOfFile = (MyUnmapViewOfFile) Address;
Или вы можете обойтись без среднего человека и передать указатель вы действительно хотите чтобы получить значение в:
GenericLoad2("kernel32.dll", (generic_funcptr_t *) &LoadedUnmapViewOfFile, "UnmapViewOfFile");
Хотя, это более опасно, чем метод с использованием промежуточной переменной - например, компилятор не даст диагностики, если вы оставите от амперсанд в этом последнем примере, однако в предыдущем примере , он обычно выдавал бы хотя бы предупреждение, если бы вы остановили амперсанд из аргумента Address
. Подобно Bug # 1 здесь: http://blogs.msdn.com/sdl/archive/2009/07/28/atl-ms09-035-and-the-sdl.aspx
Теперь вы должны быть установлены. Однако, как бы вы ни смотрели на это, вам нужно выполнить какое-то опасное кастинг. Даже в C++ с шаблонами вам нужно будет выполнить бросок на каком-то уровне (хотя вы можете скрыть его в функции шаблона), потому что API GetProcAddress()
не знает фактический тип возвращаемого указателя функции.
Также обратите внимание, что ваш интерфейс для GenericLoad()
имеет серьезную проблему с дизайном - он не позволяет управлять временем жизни библиотеки. Это может быть не проблема, если вы намерены не разрешать выгрузку библиотеки, но это то, что пользователи могут захотеть, поэтому вы должны рассмотреть эту проблему.
Новая форма «plz send codez». И, конечно, это обман. – 2009-12-08 15:32:00
Можем ли мы найти, что это такое? –
@ Нет, не могли бы вы указать мне статью, если вы так уверены? и нет, я не прошу код, потому что я ленив, но потому, что не знаю ответа. Вот почему я спросил здесь. – Jessica