Функция DLL не экспортирована: невозможно найти точку входа с именем TestFunc - PullRequest
2 голосов
/ 27 апреля 2009

Я занят знакомством с C / C ++ и взаимодействую с C #. Я проверил несколько примеров создания простой Win32 DLL и использования этого из C #, но когда я пытаюсь вызвать мою DLL, я получаю ошибку времени выполнения: «Не удалось найти точку входа с именем TestFunc». Моя DLL выглядит следующим образом, и я создал ее из проекта Win32 DLL с пустой опцией проекта:

Заголовок:

__declspec(dllexport) int TestFunc(char *, char *, char *);

Кодовый файл:

#include "stdafx.h"
#include "TestLib.h"

__declspec(dllexport) int TestFunc(char *arg1, char *arg2, char *arg3) 
{
  char str1[] = "Brady Kelly";
  char str2[] = "Hello World";
  char str3[] = "1234567890";

  strcpy(arg1, str1);

  return 128;   
}

Что я делаю не так?

Ответы [ 3 ]

6 голосов
/ 27 апреля 2009

Ваша функция скомпилирована с использованием привязок C или C ++? Вы не указываете, но мне кажется, что есть вероятность того, что вы используете компилятор C ++ - компилятор использует совершенно другое искажение имен по сравнению с компилятором C, и вы не сможете найти имя "TestFunc" так просто как если бы вы использовали компилятор C или правила искажения имени C.

Чтобы просто указать компилятору C ++ использовать правила искажения имен C, используйте это в заголовочном файле:

extern "C"
{
  __declspec(dllexport) int TestFunc(char *, char *, char *);
}
2 голосов
/ 27 апреля 2009

На самом деле, поскольку вы пометили этот вопрос как C, я бы предложил небольшое изменение по сравнению с решением 1800 INFORMATION:

#ifdef __cplusplus
extern "C" {
#endif

#ifdef EXPORT_MODE
#define METHODTYPE __declspec(dllexport)
#else 
#define METHODTYPE __declspec(dllimport)
#endif

#ifdef __cplusplus
}
#endif

/*! _The_ method */
METHODTYPE int TestFunc(char *, char *, char *);

Это позволит вам использовать один и тот же заголовок как в коде клиента, так и в коде.

Примечание: Dependency Walker больше не входит в комплект VS2008. Вы должны загрузить его, если вы используете VS2008.

2 голосов
/ 27 апреля 2009

Кроме того, вам нужен только declspec перед объявлением функции (в заголовочном файле), а не определение. Полезный инструмент для изучения того, что экспортируется из DLL, и от чего зависит DLL, это Dependency Walker .

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