Должен ли я использовать GetProcAddress или просто включить различные библиотеки win32? - PullRequest
2 голосов
/ 30 января 2009

Интересно, какая разница:

static PROCESSWALK pProcess32First=(PROCESSWALK)GetProcAddress(hKernel,"Process32First");
...
pProcess32First(...);

что такое hKernel? Посмотрите здесь . Вы можете заменить на GetModuleHandle()

и

#include <Tlhelp32.h>
...
Process32First(...);

В чем разница, интересно, что мне следует использовать. Есть ли разница с точки зрения лучших практик?

Ответы [ 4 ]

7 голосов
/ 30 января 2009

ПРИМЕЧАНИЕ. В моем ответе предполагается, что функция доступна в любом случае, но есть и другие вещи, которые следует учитывать, если вы ищете неэкспортированные функции.

Если вы используете LoadLibrary и GetProcAddress, то у вас есть опция, работающая с ограниченной функциональностью, если нужной библиотеки нет. если вы используете include и ссылку непосредственно на lib, а dll отсутствует (или не имеет экспорта из-за неправильной версии), ваше приложение просто не сможет загрузиться.

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

2 голосов
/ 30 января 2009

В дополнение к тому, что сказал Эван (это правильно), еще одно важное отличие (IMHO) заключается в том, что если вы динамически загружаете функции, вам нужно иметь typedef для приведения void * к нему, чтобы вызвать функцию один раз. он загружен Если заголовочные файлы, которые определяют прототип функции для статического связывания, не имеют механизма для определения typedef для указателя функции из того же кода определения функции шаблона, в итоге вы получите дублированное определение функции, возможно, в вашем коде. Если определения внешних заголовков когда-либо обновляются (например, с новыми определениями для 64-битных типов данных), вы рискуете ошибками времени выполнения в своем приложении, если вы не обновите другие прототипы функций (они не будут обнаружены во время компиляции из-за c- стиль приведен к функции typedef).

Это тонкий вопрос, но важный для рассмотрения. Я бы использовал неявные («статические») ссылки, если вы можете из-за этой проблемы, и если вы используете динамическую загрузку, будьте в курсе этой проблемы и структурируйте свой код так, чтобы избежать проблем в будущем как можно лучше.

2 голосов
/ 30 января 2009

Я бы выбрал первый подход, если бы у меня были дополнительные библиотеки плагинов, которые пользователь может иметь или не иметь. Для необходимых библиотек я бы использовал второй, так как для получения функций гораздо меньше кода.

2 голосов
/ 30 января 2009

См. здесь для объяснения Microsoft.

Неявное связывание (с использованием *.lib) проще.

Что касается библиотек ядра, других отличий нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...