Создание C ++ DLL для проекта C # - Функции не экспортированы - PullRequest
3 голосов
/ 18 марта 2010

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

Есть идеи? Thx,

Бернат

1 Ответ

0 голосов
/ 18 марта 2010

Кажется, вы не понимаете, какие файлы включить в ваш проект DLL по сравнению с консольным проектом. Если это правда, что «Консольный проект содержит все файлы», то это ваша проблема.

Ваш проект DLL должен включать файл cpp, который имеет __declspec (dllexport) s. Как вы это описали, вы включили ваши функции RefPointFinder () и RobotData () в консольный проект. Другими словами, ваша DLL не имеет никаких функций, независимо от того, экспортируется ли что-либо.

Само по себе включение файлов .h в основной файл DLL ничего не дает. Он не включает эти функции в DLL.

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