2010-03-17 4 views
3

일부 이미지 처리가 필요한 프로젝트에서 작업 중입니다. 프로그램의 프론트 엔드는 C#입니다 (사람들이 UI를 만드는 것이 훨씬 더 간단하다고 생각하기 때문에). 그러나 이미지 처리 부분에 많은 CPU 쥬스가 필요하기 때문에이 부분을 C++로 만들고 있습니다.C# 프로젝트 용 C++ DLL 생성 - 함수를 내 보내지 않았습니다.

아이디어는 그것을 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 부분)를 벡터와 같이 사용하고 있습니다. 그러나 내부 용으로 만 사용됩니다. 이전 코드 스 니펫에서 볼 수있는 것처럼 두 함수의 헤더에 나타나지 않습니다.

아이디어가 있으십니까? 들으,

베르나

+0

C++ 콘솔 응용 프로그램에서 함수를 호출 할 수 있습니까? 나는 이것을 먼저 시도함으로써 시작할 것입니다. –

답변

0

당신이 당신의 콘솔 프로젝트 대 사용자의 DLL 프로젝트에 포함되는 파일에 대해 혼란스러워하는 것 같다. "콘솔 프로젝트가 모든 파일을 보유하고있다"는 것이 사실이라면 이것이 문제입니다.

DLL 프로젝트에 __declspec (dllexport)가있는 cpp 파일을 포함시켜야합니다. 설명대로, RefPointFinder() & RobotData() 함수를 콘솔 프로젝트에 포함 시켰습니다. 다시 말해서, DLL은 수출 여부에 관계없이 함수가 전혀 없습니다.

.h 파일을 DLL 주 파일에 포함시키는 것만으로는 아무 것도하지 않습니다. DLL에는 이러한 함수가 포함되어 있지 않습니다.

+0

좋아, 그걸로 어느정도 해결 됐어. 나는 컴파일러가 자동으로 구현 파일을 찾아 그것을 사용할 것이라고 생각했다. DLL 파일의 포함을 다음과 같이 변경하면 문제가 해결됩니다. ///

포함 파일. #include ".. \ ImageProcessingDebug \ ImageProcessingTest.h" #include ".. \ ImageProcessingDebug \ ImageProcessing.cpp" #include ".. \ ImageProcessingDebug \ Modules.cpp " – Yeti

+0

cpp 파일을 #include하는 것은 드문 일이지만 대개 별도의 컴파일 단위로 컴파일하고 .obj 파일을 런타임에 링크합니다. – richb

관련 문제