关于X64程序对X86程序依赖的一个案例-第一篇
情景:由于我的扫描端程序是X64位的,考虑到性能和对C++编写的算法库的依赖。奈何市面上大多数扫描仪的驱动还是32位的,通过Twaincs去调用。如果用64位的twaincs和twaindsm,大部分的扫描仪驱动无法从电脑上获取到。所以希望有一个方法可以直接使用64位的程序去调用32位的驱动。
思路:
本来deepseek说利用com组件可以实现,可能是我对这个的理解不够,完成完整注册的案例就花了点时间,最后发现还是只有X86的测试程序可以发现这个组件并调用其中的方法,心态有点崩。
后面就打算直接用pipe双向通信来做一个中间层来尝试一下。
1.假定对扫描仪驱动进行操作的部分,作为提供扫描服务的server;
核心类:TwainServer :控制服务开启个关闭
ScannerBootStrap:负责对扫描仪驱动提供相关的接口
TwainServerReceiver:接受和解析客户端发送的消息,解析消息命令的内容,并驱动扫描和执行其它功能。
TwainServerSender: 发送消息回客户端,包括扫描的信息和结果
TwainServerReceiver:
namespace TwainCsServer
{
    public class TwainServerReceiver
    {
        private NamedPipeServerStream _receiver;
        public static TwainServerReceiver _instance;
        private Thread _receiveThread;
        private SynchronizationContext _syncContext;
        private ScannerBootStrap scannerBootStrap;
        private TwainServerReceiver() { }
        public bool isClosed = true;
        public static TwainServerReceiver Instance
        {
            get { return _instance ?? (_instance = new TwainServerReceiver()); }
        }
        public void Start(string senderName)
        {
            _receiver = new NamedPipeServerStream(senderName);
            _receiveThread = new Thread(ReceiveMessages);
            _receiveThread.Start();
            scannerBootStrap = ScannerBootStrap.GetInstance();
            isClosed = false;
        }
        public void setThread(SynchronizationContext mainthread)
        {
            _syncContext = mainthread;
        }
        private void ReceiveMessages()
        {
            _receiver.WaitForConnection();
            try
            {
                using (StreamReader reader = new StreamReader(_receiver))
                {
                    while (true)
                    {
                        string message = reader.ReadLine();
                        if (message != null)
                            _syncContext.Post(HandleMessage, message);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Receive error: " + ex.Message);
            }
        }
        private void HandleMessage(object state)
        {
            string message = (string)state;
            // Parse the message and call the appropriate function
            if (message.StartsWith("1:"))
            {   
                string command = message.Substring(2);
                switch(command)
                {
                    case "SelectDefaultDevice":
                        scannerBootStrap.SelectDefaultDevice();
                        break;
                    default:break;
                }
                
            }
            else if (message.StartsWith("TypeB:"))
            {
                //TypeBFunction(message.Substring(5));
            }
            else if(message.StartsWith("EXIT"))
            {
                isClosed = true;
                Console.WriteLine("Unknown message type: " + message);
            }
        }
        public void Stop()
        {
            _receiver.Close();     
        }
        public bool IsClosed()
        {
            return isClosed;
        }
    }
}
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号