Я работаю над проектом, где я создаю небольшую DLL, а затем создаю приложение Windows для его использования.
Я не могу понять, что происходит.
У меня есть функция в DLL, называемая "startPicadorVisual", которая принимает один параметр, который является std :: string.
В приложении, которое зависит от DLL, у меня есть следующий код в основном автогенерированном файле.h:
typedef void (__stdcall *f_startPicadorVisual)(string s);
namespace PicadorPrototype {
f_startPicadorVisual startPicadorVisual;
Form1(void) {
//Load DLL Funcs
HINSTANCE hGetProcIDDLL = LoadLibrary(L"..\\Debug\\Picador.dll");
if (!hGetProcIDDLL) {
std::cout << "could not load the dynamic library" << std::endl;
throw "Bad Stuff";
}
startPicadorVisual = (f_startPicadorVisual)GetProcAddress(hGetProcIDDLL, "startPicadorVisual");
if (!startPicadorVisual) {
std::cout << "could not locate the function" << std::endl;
throw "More Bad Stuff";
}
Когда это не удается на втором этапе, когда я вызываю GetProcAddress.
В моей DLL функции определяются следующим образом:
void __declspec(dllexport) startPicadorVisual(string fixtureNamet);
PicadorResults __declspec(dllexport) getPicadorReading(string fixtureName);
Может ли кто-нибудь сказать мне, почему это не работает?
GetProcAddress
терпит неудачу, если имя, которое вы даете GetProcAddress
, не соответствует точно названию функции, которую вы вызываете. Точно я имею в виду все - символы, которые составляют имя функции, имя функции должно совпадать с корпусом и т.д.
Таким образом, либо ваша DLL экспортировала другое имя, и вы этого не понимали, или вы вообще не экспортируете имя.
Вы можете легко найти имена экспортированных функций DLL, вы можете использовать программу Dependency Walker, найденную здесь: http://www.dependencywalker.com/
Кроме того, не рекомендуется использовать объекты C++, которые выделяют динамическую память, такую как std::string
качестве параметров. Если вы это сделаете, ваша DLL будет работать только для приложений, которые
В противном случае ваш код будет иметь неопределенное поведение, более чем вероятно сбой, даже если вы добрались до правильного указания указателя функции.