关于VC和C#分别调用VC写的COM组件问题
有一组用来进行OCR识别的代码,将其用VC封装成COM组件,然后用VC和C#分别调用这个COM组件(代码一致),结果出现VC调用成功,c#调用失败的问题;经调试发现问题出在COM组件加载OCR引擎的时候,主要代码如下:
/*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; }