WIN7下的MODI

 

  1. MODI梦魇

MODI代码其实很简单,简单调用即可,网上一大堆的源代码,稍加改造即可:

UnicodeString __fastcall TOcrDllObject::MODIOcrText

     (UnicodeString destTifFileName, int langid,

    bool orientImageFlag, bool straightenImage) {

    UnicodeString result = "";

    Modi_tlb::MiLANGUAGES language = (Modi_tlb::MiLANGUAGES)langid;

    GlobalMiDocView->FileName = destTifFileName;

    if (GlobalMiDocView->PageNum < 0)

        return "";

 

    HRESULT hr = 0;

    IDocument *IDobj = NULL;

    ILayout *ILayout = NULL;

    IImages *IImages = NULL;

    IImage *IImage = NULL;

    IWords *IWords = NULL;

    IWord *IWord = NULL;

    // *

    try {

        IUnknown *pVal = GlobalMiDocView->Document;

        if (pVal != NULL) {

            hr = pVal->QueryInterface(IID_IDocument, (void**) & IDobj);

            if (SUCCEEDED(hr)) {

                hr = IDobj->OCR(language, // Modi_tlb::MiLANGUAGES::miLANG_CHINESE_SIMPLIFIED,

                    1, 1);

                if (SUCCEEDED(hr)) {

                    IDobj->get_Images(&IImages);

                    long iImageCount = 0;

                    IImages->get_Count(&iImageCount);

                    for (int img = 0; img < iImageCount; img++) {

                        IImages->get_Item(img, (IDispatch * *) & IImage);

                        IImage->get_Layout(&ILayout);

 

                        long numWord = 0;

                        ILayout->get_NumWords(&numWord);

                        ILayout->get_Words(&IWords);

                        IWords->get_Count(&numWord);

 

                        UnicodeString ocrResult = "";

                        for (long i = 0; i < numWord; i++) {

                            IWords->get_Item(i, (IDispatch * *) & IWord);

                            BSTR tempResult;

                            IWord->get_Text(&tempResult);

                            UnicodeString info;

                            info.sprintf(L"%s", tempResult);

                            ocrResult += info;

                        }

                        if(ocrResult.Length())

                            result += ocrResult;

                        IWord->Release();

                        IWords->Release();

                        ILayout->Release();

                        IImage->Release();

                    }

                    IImages->Release();

                }

                else {

                    THelper::GetSystemErrorInfo(false);

                }

            }

            else {

                THelper::GetSystemErrorInfo(false);

            }

            IDobj->Close(0);

            IDobj->Release();

            pVal->Release();

        }

        pVal = NULL;

        IDobj = NULL;

        ILayout = NULL;

        IImages = NULL;

        IImage = NULL;

        IWords = NULL;

        IWord = NULL;

    }

    catch(...) {

        THelper::MessageBox(THelper::GetSystemErrorInfo());

    }

    return result;

}

信心满满,开始运行:

自动分区结果:

但识别出错,最终只有图片结果,文字内容全为空

这中间的反复折腾啊,代码调整,均无济于事。

有点绝望了。在WIN7下不行吗?

  1. 柳暗花明

带着WIN7下的疑问,开始安装VitualBox,计划在虚拟机中安装WINXP系统。

当然,这个是要花时间的。

一切妥当后,在虚拟机中安装CB6,编译上述代码,结果不出错,且识别出结果。再将WIN7下的可执行程序拷贝到XP中,运行,也得到期望的正确结果(识别错误的地方基本上都是混合识别问题),纯粹的汉字识别正确率已超过90%:

这一下,总算给自己打了一剂强心针,程序还没问题,只是在WIN7不能运行OCR模块。

这当然是不行的。

突然想到,可能是WIN7下的管理员身份问题,回到WIN7下,右键选择"以管理员身份运行",OK了。

但这带来一个问题:不能在CB中进行调试,需要编译链接后,在资源管理器中找到目标EXE文件,然后手动进行选择管理员身份。

太不爽。几遍之后就烦了。

怎么办?

突然一下想到,是否可以试下以管理员身份运行IDE,然后看能否在IDE中进行调试。

结果又OK了,我都有点佩服自己了。

这下效率又高起来了。剩下的问题只是能否生成自动以管理员身份运行的程序了。

  1. 管理员身份

上网一搜,发现这个问题还问得比较多,解决方法也简单:

加上UAC盾牌,但短的没有包含WIN7风格 使用长的就行了

去掉delphi设置里边的 Enable runtime themes 就没有警告提示了

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

  <assemblyIdentity

  type="win32"

  name="DelphiApplication"

  version="1.0.0.0"  

  processorArchitecture="*"/>

  <dependency>

  <dependentAssembly>

  <assemblyIdentity

  type="win32"

  name="Microsoft.Windows.Common-Controls"

  version="6.0.0.0"

  publicKeyToken="6595b64144ccf1df"

  language="*"

  processorArchitecture="*"/>

  </dependentAssembly>

  </dependency>

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">  

<security>  

<requestedPrivileges>  

<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>  

</requestedPrivileges>  

</security>  

</trustInfo>   

</assembly>

 

保存为 UAC.manifest

 

编写一个 UAC.rc文件

1 24 UAC.manifest

 

再生成UAC.res文件

D2010生成方法:

在ProjectGroup的项目文件名上 比如project1.exe上 

点右键 选择Add 选择 UAC.rc文件

编译 即可生成 UAC.res文件

 

使用方法如下,加在dpr文件中:

 

program 文本批量翻译助手;

 

uses

  Forms,

  GoogleUnit1 in 'GoogleUnit1.pas' {Form_Main},

 

{$R *.res}

{$R UAC.res}     //

 

这样程序启动时会弹出提示 选择管理员运行

照猫画虎,这个还是会的:

uac.rc:

1 24 QianCamera.exe.manifest

将之编译成为uac.res

再在程序中写入:

#pragma resource "uac.res"

运行后提示询问,不过悲催的是,这个窗口截不了屏,WIN7在设计的时候,弹出用户账户控制窗口时,可能屏蔽了所有的键盘响应事件。

不过,我的目的已达到,没图没真相而已。

原文地址:https://www.cnblogs.com/drgraph/p/3083153.html