Драйвер Twain — ошибка TWAINDSM.DLL в ОС Windows x64

Мы разработали приложение для контроля и сканирования любых файлов, таких как изображения и т. д., в виде приложения C # Winform, и оно успешно работает на платформе ОС x86. В приложении мы используем класс C# twain, который отправляет команду сканеру, чтобы мы могли достичь того, чего хотим. Как вы все знаете, файл Twain_32.dll используется для запуска приложения и сканирования без сбоев.

Мой вопрос заключается в том, что на платформах ОС x64 мы не можем запустить приложение и получаем сообщение об ошибке BadImageFormatException, которое пытается сообщить нам, что все дело в типе ОС! Итак, эта ошибка указывает мне, что я пытаюсь запустить приложение под несовместимым типом ОС.

Я столкнулся с тем, что 32-битная twain dll работает в системах x64, но на моем пути возникла другая проблема. Мы запускаем все наши приложения в одной родительской форме, которая является родительской формой MDI. Итак, форма, которую я хочу использовать для целей сканирования, будет формой клиента MDI. Итак, хотя моя программа скомпилирована как ЛЮБОЙ ЦП, CLR будет запускать ее как 64-разрядное приложение в Windows x64. ОПЕРАЦИОННЫЕ СИСТЕМЫ. Вот почему я не могу запустить приложение, даже если я скомпилировал свою форму сканирования как цель платформы x86 в ОС x64 Win.

До сих пор, я надеюсь, вы все поняли, что я имею в виду!!!

В качестве решения я попытался установить установочный файл Twack64, чтобы получить файл TWAINDSM.dll и запустить свое приложение на компьютерах с ОС x86 и x64. . Кроме того, в моем пользовательском исходном проекте twain я изменил атрибут импорта dll на TWAINDSM.dll вместо Twain_32.dll, но это не сработало.

Я что-то упустил или приложение Twain C# не распознает TWAINDSM.dll как twain dll? Я застрял на этом шаге и не могу двигаться дальше!!! дергаю за волосы 3-4 дня!!! :(

Быстрая рука будет большим подспорьем для меня, ребята! С нетерпением жду Вашего ответа!!!


person Muzzy B.    schedule 10.05.2015    source источник
comment
С какой проблемой вы столкнетесь, если скомпилируете все приложение для x86 вместо AnyCPU? Это должно создать идеально работающее 32-битное приложение в 64-битных системах, и, конечно же, вы можете использовать 32-битные библиотеки.   -  person Steve    schedule 11.05.2015
comment
Это имеет смысл для приложения небольшого размера, но то, что вы говорите, действительно трудно добиться прогресса для приложения большого размера, потому что я говорю о примерно 100 или более источниках проекта... Я должен заставить их все скомпилировать для платформы x86. цель... Проблема в том, что я должен поговорить об этом с моим менеджером, но вместо этого я пытаюсь найти более дешевый и простой способ... нет ли примера для приложений x64, чтобы использовать другой драйвер twain, например, с помощью TWAINDSM.dll? ?   -  person Muzzy B.    schedule 11.05.2015


Ответы (1)


Мы нашли другой способ вместо того, чтобы искать dll TwainDSM для x64, который мы не могли найти в моей компании.

Я разместил тему на твафоруме по этому поводу, через некоторое время мне вернули ответ - ссылка ниже:

Ссылка на 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, чтобы использовать его в моем проекте? Есть способ сделать это! Просто поместите код одной строки в файл Program.cs файла FileName.Exe, как показано ниже: (я также поставил вертикальную линию для разделения параметров)

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

и, наконец, я читаю значения из значения результата следующим образом:

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

Я надеюсь, что у вас есть идея здесь, и ответ полезен для ваших нужд!

person Muzzy B.    schedule 04.06.2015