функция из одной dll, вызывающая то же имя, функция из другой dll - PullRequest
6 голосов
/ 02 декабря 2011

У меня особенная проблема.У меня есть две DLL, давайте назовем их DLL-A и DLL-B.

DLL-A имеет функцию с именем f1(), а DLL-B также имеет функцию с тем же именем, f1().Теперь в DLL-A f1() вызывает f1() DLL-B следующим образом.

DLL-A :

f1()
{
    f1(); //this is DLL-B function, but having the same name
}

Теперь мой вопросчто, это будет рекурсивный вызов f1() из DLL-A?

Ответы [ 5 ]

7 голосов
/ 02 декабря 2011

f1() внутри тела функции вызывает себя, что приводит к бесконечной рекурсии, как вы и предполагали. Некоторые возможные решения:

  • Поместите импортированную функцию DLL в отдельное пространство имен, чтобы вы могли различать ее имя.
  • Измените названия этих функций, чтобы избежать конфликта.
  • Импорт явно вместо неявно с использованием GetProcAddress. Это позволяет вам вызывать импортированную функцию как угодно.
6 голосов
/ 02 декабря 2011

Вы можете изменить имя функции в DLL-A на A_f1.

A_f1()
{
  f1() //this calls DLL-B's f1
} 

В своем файле DEF напишите

EXPORTS
    f1 = A_f1

Это говорит: «Функция Iвнутренне названный A_f1 должен быть экспортирован под именем f1 в другие компоненты. "Таким образом, каждый, кто использовал DLL-A и вызывает f1 (ожидая получить функцию A), получит A_f1.

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

3 голосов
/ 02 декабря 2011

Как вы написали, f1 в пределах f1 не будет вызывать DLL-B, но будет бесконечной рекурсией. Если вы хотите вызвать функцию DLL-B, вам придется использовать GetProcAddress

2 голосов
/ 28 августа 2013

Может быть, вы можете изменить имя на:

#pragma comment(linker, "/export:MyFunc=_MyFunc@8")
2 голосов
/ 02 декабря 2011

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

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

Чтобы решить эту проблему, поместите функции в пространства имен.

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