我正在开发一个需要一些图像处理的项目。程序的前端是C#(因为人们认为在其中制作UI要简单得多)。但是,由于图像处理部分需要大量的CPU汁液,我在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 http://img401.imageshack.us/img401/9/20100317152758.jpg 另一方面,我没有使用C ++对象(这里是C ++ DLL部分),例如向量。但是,仅供内部使用。从前面的代码片段中可以看出,它们不会出现在任一函数的标题中。
有什么想法吗? THX,
Bernat
答案 0 :(得分:0)
您似乎对DLL项目中包含哪些文件与控制台项目相混淆。如果确实“控制台项目包含所有文件”,那么这就是你的问题。
您的DLL项目需要包含具有__declspec(dllexport)的cpp文件。正如您所描述的那样,您已经包含了RefPointFinder()&amp; RobotData()在控制台项目中起作用。换句话说,无论是否导出任何内容,您的DLL都没有任何功能。
只包含DLL主文件中的.h文件本身不会做任何事情。它不包括DLL中的这些函数。