Я пытаюсь написать и протестировать DLL-файл на C ++, который я могу вызывать всякий раз, когда мне нужен доступ на уровне файловой системы. В настоящее время у меня огромная головная боль при попытке доступа к методам в этой DLL в C ++. Как ни странно, мне удалось без особых проблем вызвать код в отдельной программе на C #, но я хочу получить представление о том, как dll-взаимодействие работает в C ++.
И это .cpp для моего фиктивного исполняемого файла, который должен вызывать только мой тестовый метод «newMain».
// dummy.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"#include <iostream>
#include <string>
//#pragma comment(lib,"visa32.lib")
#pragma message("automatic link to adsInterface.dll")
#pragma message(lib, "adsInterface.lib"
extern "C" int __stdcall newMain();
int _tmain(int argc, _TCHAR* argv[])
{
newMain();
std::string i;
std::cin >> i
return 0;
}
Проблема в том, что при запуске я получаю эту ошибку:
error LNK2019: unresolved external symbol _newMain@0 referenced in function _wmain
error LNK1120: 1 unresolved externals
Вот .h для adsInterface:
// adsInterface.h
#ifndef ADSINTERFACE_H
#define ADSINTERFACE_H
/* //save this for later i have no clue how this really works.
#ifdef ADSAPI_EXPORTS
#define ADSAPI __declspec(dllexport)
#else
#define ADSAPI __declspec(dllexport)
#endif
*/
namespace ADSInterface
{
//test method. should print to console.
__declspec(dllexport) int __stdcall newMain();
void hello();
}
#endif
и вот мой .cpp для adsInterface:
// adsInterface.cpp : Defines the exported functions for the DLL application.
//
#include "stdafx.h"#include "adsInterface.h"#include <iostream>
namespace ADSInterface
{
/* this is where the actual internal class and other methods will go */
void hello()
{
std::cout << "hello from the DLL!" << std::endl;
}__declspec(dllexport) int __stdcall newMain()
{
hello();
return 0;
}
}
Я также включу файл .def, который использовал при компиляции dll:
; adsInterface.def - defines exports for adsInterface.dll
LIBRARY ADSINTERFACE
;DESCRIPTION 'A C++ dll that allows viewing/editing of alternate data streams'
EXPORTS
newMain @1
Как ни странно, я смог импортировать метод в C # с этой строкой (мне не нужно было также включать файл .lib):
[DllImport("./adsInterface.dll")] private static extern void newMain();
И он побежал, когда я назвал это нормально:
newMain();
Я читал много разных руководств о том, как импортировать функции dll, и я дошел до того, что мне кажется, что я просто комбинирую различные способы импорта между языками и просто путаюсь. Если кто-нибудь сможет дать некоторое представление о том, как я должен импортировать dll-методы в C ++, это было бы очень полезно.
удалить это объявление:
extern "C" int __stdcall newMain();
и вызвать ADSInterface :: newMain () из _tmain.
В опубликованном коде вы не определили ничего, соответствующего этому объявлению, не так ли?
Или сделайте реализацию, вызывающую другую, или перетащите ее из пространства имен в глобальное.
Других решений пока нет …