Я работаю над проектом, который требует некоторой обработки изображений. Фронтенд программы написан на C# (потому что ребята подумали, что на нем намного проще сделать пользовательский интерфейс). Однако, поскольку часть обработки изображений требует много ресурсов процессора, я делаю эту часть на C++.
Идея состоит в том, чтобы связать его с проектом C# и просто вызвать функцию из DLL, чтобы сделать часть обработки изображения и позволить среде C# впоследствии обрабатывать данные. Теперь единственная проблема в том, что я не могу создать DLL. Проще говоря, компилятор отказывается помещать какую-либо функцию в DLL, которую я компилирую.
Поскольку проект требует некоторого тестирования времени разработки, я создал два проекта в решении C++. Один для Dll, а другой для консольного приложения. Консольный проект содержит все файлы, и я просто включаю соответствующий заголовок в свой файл проекта DLL. Я подумал, что компилятор должен убрать те функции, которые я пометил как экспортируемые, и сделать из них DLL. Тем не менее этого не происходит.
Вот как я определил функцию в заголовке:
extern "C" __declspec(dllexport) void _stdcall RobotData(BYTE* buf, int** pToNewBackgroundImage, int* pToBackgroundImage, bool InitFlag, ObjectInformation* robot1, ObjectInformation* robot2, ObjectInformation* robot3, ObjectInformation* robot4, ObjectInformation* puck);
extern "C" __declspec(dllexport) CvPoint _stdcall RefPointFinder(IplImage* imgInput, CvRect &imgROI,
CvScalar &refHSVColorLow, CvScalar &refHSVColorHi );
Далее следует реализация в файле cpp:
extern "C" __declspec(dllexport) CvPoint _stdcall RefPointFinder(IplImage* imgInput, CvRect &imgROI,&refHSVColorLow, CvScalar &refHSVColorHi ) { \\...
return cvPoint((int)( M10/M00) + imgROI.x, (int)( M01/M00 ) + imgROI.y) ;}
extern "C" __declspec(dllexport) void _stdcall RobotData(BYTE* buf, int** pToNewBackgroundImage, int* pToBackgroundImage, bool InitFlag, ObjectInformation* robot1, ObjectInformation* robot2, ObjectInformation* robot3, ObjectInformation* robot4, ObjectInformation* puck) { \\ ...};
И мой основной файл для проекта DLL выглядит так:
#ifdef _MANAGED
#pragma managed(push, off)
#endif
/// <summary> Include files. </summary>
#include "..\ImageProcessingDebug\ImageProcessingTest.h"
#include "..\ImageProcessingDebug\ImageProcessing.h"
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
return TRUE;
}
#ifdef _MANAGED
#pragma managed(pop)
#endif
Излишне говорить, что это не работает. Быстрый просмотр с помощью средства просмотра экспорта DLL 1.36 показывает, что в библиотеке нет никакой функции. Я не понимаю. Что я делаю неправильно? Поскольку я не использую объекты C++ (и здесь это часть DLL C++), такие как вектор. Однако только для внутреннего использования. Они не будут отображаться в заголовках ни одной из функций, как видно из предыдущих фрагментов кода.
Любые идеи? Спасибо,
Бернат