关于VC和C#分别调用VC写的COM组件有关问题
关于VC和C#分别调用VC写的COM组件问题
有一组用来进行OCR识别的代码,将其用VC封装成COM组件,然后用VC和C#分别调用这个COM组件(代码一致),结果出现VC调用成功,c#调用失败的问题;经调试发现问题出在COM组件加载OCR引擎的时候,主要代码如下:
看起来c#调用时,似乎是加载某些dll失败,但是实在找不到原因,路径什么的应该没什么问题,VC就能正确调用,还望高手相助,不胜感激;
------解决方案--------------------
首先保证加载成功,然后才能说是否为调用时的错误
------解决方案--------------------
用depend.exe看看需要加载什么dll;
DLL中加入了一个的DEF文件
参考:
http://topic.csdn.net/t/20050902/20/4246780.html
------解决方案--------------------
enable native debug, then debug into
有一组用来进行OCR识别的代码,将其用VC封装成COM组件,然后用VC和C#分别调用这个COM组件(代码一致),结果出现VC调用成功,c#调用失败的问题;经调试发现问题出在COM组件加载OCR引擎的时候,主要代码如下:
- C/C++ code
/*szOCRDLL(绝对路径)为其他公司提供的OCR识别的DLL,该DLL同时调用了其他一些DLL, 这些dll放在一个目录中,比如D://TmpDLL,在调用::LoadLibrary((LPCTSTR)szOCRDll)之前已经 设置当前工作目录为D://TmpDLL,方便搜索并加载这些dll;*/ SetLastError(0); if (HMODULE hModule = ::LoadLibrary((LPCTSTR)szOCRDll)) { //在这里调用GetLastError的话,VC和C#分别返回 0 和 6 GetDriverFuncs_Ptr pGetDriverFuncs = (GetDriverFuncs_Ptr)::GetProcAddress(hModule, "GetDriverFuncs"); if (!pGetDriverFuncs) { ::FreeLibrary(hModule); return OCR_ERROR_LOAD_DLL_FAILED; } //获取DLL提供的功能函数表 OCR_DWORD funcCount = 0; OCR_LPFunc tempTable = NULL; pGetDriverFuncs(&tempTable, &funcCount); DWORD * funcTable = new DWORD[256]; int i = funcCount; while(i--) { funcTable[tempTable[i].func_index] = (DWORD)tempTable[i].func_address; } //开始初始化OCR引擎,INDEX_OCRInitialize是OCRInitialize函数在函数表中的索引 OCR_ErrCode err = ((OCRInitialize)funcTable[INDEX_OCRInitialize])(NULL, L"en", GetLicense); //在这里调用GetLastError的话,VC和C#分别返回 0 和 126 if(OCR_SUCCESS != err) return err; }
看起来c#调用时,似乎是加载某些dll失败,但是实在找不到原因,路径什么的应该没什么问题,VC就能正确调用,还望高手相助,不胜感激;
------解决方案--------------------
首先保证加载成功,然后才能说是否为调用时的错误
------解决方案--------------------
用depend.exe看看需要加载什么dll;
DLL中加入了一个的DEF文件
参考:
http://topic.csdn.net/t/20050902/20/4246780.html
------解决方案--------------------
enable native debug, then debug into