Я работаю с приложением, которое появляется (только что началось несколько недель назад, поэтому я все еще изучаю старые приложения), которое будет создано на C, и моя компания хочет использовать эту возможность для вызова внешней библиотеки DLL для расширения некоторых новых функциональность. Для этого я начал работать над своей POC, которая является первым двумя файлами ниже. Единственной спецификацией, которую мы получили, было то, что dll пришлось экспортировать следующую функцию: extern int __stdcall TestMethod_LoadCustomer(const char * name, char * id);
Я попытался реализовать это следующим образом:
TestDLL.h
#define TestDLL_API __declspec(dllexport)
namespace TestDLL
{
class TestDLL
{
public:
static TestDLL_API int TestMethod_LoadCustomer(const char* name, char* id);
};
}
TestDLL.cpp
// TestDLL.cpp : Defines the exported functions for the DLL application.
//
#include "stdafx.h"
#include "TestDLL.h"
#include <string.h>
extern "C" int __declspec(dllexport) __stdcall TestMethod_LoadCustomer(const char* name, char* id)
{
if (strlen(name) <= 8) {
strcpy(id, name); // name contains customer id
} else {
id[0] = 0; // Customer not found
}
return 0;
}
Эти два файла скомпилированы. Проблема возникает, когда я пытаюсь протестировать эту DLL с помощью отдельного небольшого консольного приложения, показанного здесь: RunTEST.cpp
// RunTest.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include "TestDLL.h"
using namespace std;
int _tmain()
{
char* id= "";
TestDLL::TestDLL::TestMethod_LoadCustomer("77777", id);
cout << id;
cin >> id;
return 0;
}
Все, что я ищу, это возможность передать строку символов в вызов TestMethod_LoadCustomer() и добавить ее в поле id.
Когда я на самом деле пытаюсь построить это решение, я получаю следующую ошибку:
"ошибка LNK2019: неразрешенный внешний символ" public: static int __cdecl TestDLL :: TestDLL :: TestMethod_LoadCustomer (char const *, char *) "(? TestMethod_LoadCustomer @TestDLL @1 @SAHPBDAD @Z), на который ссылается функция _wmain"
Я предполагаю, что это имеет какое-то отношение к тому, как я пытаюсь ссылаться на него в своем клиентском приложении, но я не уверен. Я посмотрел на другие ошибки LNK2019 на StackOverflow, но ни одно из этих решений, похоже, не работало здесь, я неправильно их реализовал. Может ли кто-нибудь помочь мне избавиться от этого сообщения об ошибке?
В файле TestDLL.cpp отсутствуют две вещи:
1) Пространство имен TestDLL.
2) TestDLL :: перед именем метода.
// TestDLL.cpp : Defines the exported functions for the DLL application.
//
#include "stdafx.h"
#include "TestDLL.h"
#include <string.h>
namespace TestDLL {
extern "C" int __declspec(dllexport) __stdcall TestDLL::TestMethod_LoadCustomer(const char* name, char* id)
{
if (strlen(name) <= 8) {
strcpy(id, name); // name contains customer id
} else {
id[0] = 0; // Customer not found
}
return 0;
}
}
__stdcall
, а также extern "C"
инструкция extern "C"
.
Определяя функцию в TestDLL.cpp, вы не отметили, что функция является членом класса TestDLL.
TestDLL::
beforeTestMethod_LoadCustomer
в TestDLL.cpp?#define TestDLL_API __declspec(dllexport)
Это должно быть __declspec (dllimport) для любого exe-файла, который использует dll и __declspec (dllexport) для самой dll.