繁体   English   中英

Twain驱动程序-Windows OS x64中的TWAINDSM.DLL错误

[英]Twain Driver - TWAINDSM.DLL Error in Windows OS x64

我们开发了一个应用程序来控制和扫描任何文件,例如图像等,如C#Winform App,它可以在x86 OS平台上成功运行。 在应用程序中,我们使用C#twain类向扫描器发送命令,从而实现所需的功能。 众所周知, Twain_32.dll文件用于运行应用程序并进行扫描而不会失败。

我的问题是,在x64 OS平台上,我们无法运行该应用程序,并得到一个名为BadImageFormatException的错误,该错误试图告诉我们有关操作系统类型的所有信息! 所以这个错误指出我尝试在不兼容的OS类型下运行该应用程序。

我已经体验到32位twain dll在x64系统下工作,但是另一个问题困扰着我。 我们在一个父表单(即MDI父表单)下运行所有​​应用程序。 因此,我要用作扫描目的的表单将是MDI客户表单。 很好,尽管我的程序被编译为ANYCPU ,但CLR将在Windows x64 OS中将其作为x64位应用程序运行。 这就是为什么即使我将扫描表单编译为x64 Win OS中的x86平台目标也无法运行该应用程序的原因。

直到这里,我希望你们都明白我的意思!!!

作为解决方案,我尝试安装Twack64安装文件以获取TWAINDSM.dll文件并在x86和x64 OS计算机上运行我的应用程序。 另外,在我的自定义twain源项目中,我将dll导入属性TWAINDSM.dll替换为Twain_32.dll,但没有成功。

那么,我是否在这里丢失了某些内容,或者Twain C#应用程序无法将TWAINDSM.dll识别为twain dll? 我被困在这一步,无法继续前进!!! 拉我的头发3-4天!!! :(

快速的手将对我大有帮助! 期待您的回音!!!

我们找到了另一种方法,而不是为x64寻找TwainDSM dll,而这实际上是我公司内部无法做到的。

经过一段时间的回复后,我在twainforum上发布了一个主题,其链接如下:

我发布的有关该问题的TwainForum链接!

好吧,当时还不足以找到我的出路。 在得到答案之前,我们已经达成协议,可以使用System.Diagnostics.Process类来解决此问题,以便根据需要在x64平台上工作。 我使用的代码如下:

        var proc = new System.Diagnostics.Process();
        String path = "";
        var pathArray = System.Windows.Forms.Application.StartupPath.Split('\\');
        for (int i = 0; i < pathArray.Count() - 1; i++)
        {
            path += pathArray[i] + "\\";
        }
        path = path + "fileName.EXE";
        proc.StartInfo.FileName = path;
        proc.StartInfo.RedirectStandardOutput = true;
        proc.StartInfo.UseShellExecute = false;

        proc.Start();
        string result = proc.StandardOutput.ReadToEnd();
        proc.WaitForExit();
        if (string.IsNullOrEmpty(result))
        {
            MessageBox.Show("No Response from Scanner Screen!", "ERROR!");
            return;
        }

但是如何从该exe传递参数以在我的项目中使用它? 有一种方法可以做到! 只需在FileName.Exe的Program.cs文件中放入一行代码,如下所示:(我也将竖线用于单独的参数)

Console.Write(FilePathAndName + "|" + PicFormArsivOK.ToString() + "|" + TarayiciFormArsivOK.ToString());

最后我从结果值中读取值,如下所示:

 if (result.Split('|').First() != "" && (Convert.ToBoolean(result.Split('|')[1]) == true | Convert.ToBoolean(result.Split('|')[2]) == true))
        {
          //TODO:  
        }

希望您在这里有了主意,答案对您的需求很有用!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM