关于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号