Я работаю над проектом, который требует некоторой обработки изображений. Внешний интерфейс программы - 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 ++ (а здесь это часть C ++ DLL), такие как вектор. Однако только для внутреннего использования. Они не будут отображаться в заголовках обеих функций, как вы можете наблюдать из предыдущих фрагментов кода.
Есть идеи? Thx,
Бернат