Указатель на функцию, полученный из GetProcAddress, приводит к сбою программы, если он использует stdlib - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь динамически загрузить dll и вызвать функцию из него во время выполнения. Мне удалось получить рабочий указатель с GetProcAddress, но программа падает, если функция из dll использует stdlib. Вот код из исполняемого файла, который загружает dll:

#include <iostream>
#include <windows.h>

typedef int (*myFunc_t)(int);

int main(void) {
  using namespace std;
  HINSTANCE dll = LoadLibrary("demo.dll");
  if (!dll) {
    cerr << "Could not load dll 'demo.dll'" << endl;
    return 1;
  }
  myFunc_t myFunc = (myFunc_t) GetProcAddress(dll, "myFunc");
  if (!myFunc) {
    FreeLibrary(dll);
    cerr << "Could not find function 'myFunc'" << endl;
    return 1;
  }
  cout << "Successfully loaded myFunc!" << endl;
  cout << myFunc(3) << endl;
  cout << myFunc(7) << endl;
  cout << myFunc(42) << endl;
  cout << "Successfully called myFunc!" << endl;
  FreeLibrary(dll);
  return 0;
}

Вот код для dll, который действительно работает:

#include <iostream>

extern "C" {

  __declspec(dllexport) int myFunc(int demo) {
    //std::cout << "myFunc(" << demo << ")" << std::endl;
    return demo * demo;
  }

}

int main(void) {
  return 0;
}

(Обратите внимание, что метод main в коде dll предназначен только для успокоения компилятора)

Однако, если я раскомментирую строку с std::cout, программа вылетает после строки cout << "Sucessfully loaded myFunc!" << endl;, но до того, как что-либо еще будет напечатано. Я знаю, что должен быть какой-то способ делать то, что я хочу; что мне нужно изменить, чтобы он работал?

1 Ответ

0 голосов
/ 02 мая 2018

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

...