Заранее извиняюсь за ошибки нуба. Это мой первый вопрос здесь. Сначала немного предыстории:
Я пытаюсь создать модуль для программы, используя средство обхода зависимостей, чтобы найти функции C ++ в .dll, для которых у меня нет библиотеки или какого-либо исходного кода. Вы также можете предположить, что я не могу получить поддержку от первоначального разработчика. По сути, я проверил другой файл, который обращается к нему, чтобы увидеть, каковы минимальные функции для его работы. Вот пример неокрашенных имен, которые выводятся:
void foo::bar::baz(float)
float foo::bar::qux(void)
foo::bar::bar(void)
class foo::bar & foo::bar::operator=(class foo::bar const &)
Две верхние функции, очевидно, принимают float или void и возвращают float или void. Я получил похожую функцию, работающую с использованием чего-то вроде:
HINSTANCE THEDLL = LoadLibrary("C:\\dllFolder\\theDll.dll");
typedef float (*quxType)(void);
quxType qux = (quxType)GetProcAddress(THEDLL, "quxMangledName");
Так что это не проблема.
Сейчас, третья в списке выглядит как другая функция, которая принимает void, но не имеет явного возвращаемого типа. Означает ли это, что я должен просто использовать неявный тип для него, это void, или это действительно не функция? Если нет, то что это?
Понятия не имею, что делать с четвертым. Можно ли вообще справиться без связанного файла .h?
Я оглянулся, но не смог найти никакой информации о том, что делать, когда функция не похожа на обычную функцию с явным типом возврата. Несмотря на использование в основном того же кода, который я использовал для получения функции, работающей в аналогичном .dll, я продолжаю получать сбой при нарушении прав доступа, когда пытаюсь использовать здесь функцию № 2 (мне действительно просто нужна функция № 2). Так что я предполагаю, что .dll нужно больше информации или сначала нужно что-то инициализировать, поэтому меня интересуют остальные в списке.
Я понимаю, что это сложная проблема, поэтому, вероятно, не будет решения «Правильный ответ», чтобы заставить его работать, но если я делаю какие-либо очевидные ошибки, или если есть какие-либо общие предложения о том, как атаковать проблему (даже альтернативы ходок зависимости), дайте мне знать.
Третий является конструктором по умолчанию для бара.
Четвертый — это оператор копирования копии бара.
Я думаю, что вам нужно сначала создать экземпляр класса, чтобы вызвать 2-й метод. В противном случае метод будет вызван с недопустимым «this», что вызывает нарушение прав доступа.
Проблема в том, как вы это создаете?
Если вы можете найти фабричную функцию, которая возвращает панель в DLL, вы можете попробовать ее использовать.
Если вы не видите заводскую функцию и у вас нет файла lib, вы можете обратиться к ответам здесь о том, как создать библиотеку из DLL: Как сделать файл .lib, если есть файл .dll и файл заголовка
Вам также необходимо создать заголовочный файл для класса с правильным порядком и типами членов. Таким образом, вам не нужно использовать LoadLibrary и GetProcAddress, просто используйте класс как обычно.
Вы все еще можете использовать LoadLibrary и GetProcAddress без lib и заголовка, хотя этот блог показывает, как вручную распределить память, вызвать конструктор, получить объект и передать этот объект для вызова метода: http://recxltd.blogspot.com/2012/02/working-with-c-dll-exports-without.html
Других решений пока нет …