我们正在使用的兄弟标签打印机(QL-系列)通过它的编程接口/SDK,称为'bPac‘。该工具是标签打印工具的一部分,目前正在从Ruby重写为Rust。在这个过程中,我被困在了Rust的Win32 32/COM/OLE上。Ruby中的一个最小的工作示例就足够简单了:
doc = WIN32OLE.new "bpac.Document"
doc.open 'some_label.lbx'
doc.SetPrinter "Brother QL-810W", true
print_opts = 0
doc.StartPrint("", print_opts)
doc.PrintOut(1, print_opts)
doc.EndPrint
我希望有一个类似的简单工作的例子,在铁锈开始。由于我不熟悉Windows,所以windows-rs
机箱非常强大。我想,我可能需要它的System::Com
部分。以下是我的开场白:
use windows::Win32::System::{Com, Ole};
use ::windows::core::Result;
pub fn print() {
unsafe { Com::CoInitializeEx(std::ptr::null(), Com::COINIT_APARTMENTTHREADED) }.unwrap();
let clsid = unsafe { Com::CLSIDFromProgID("bpac.Document") };
println!("We've got a CLSID: {:?}", clsid);
let obj: Result<Com::IDispatch> = unsafe { Com::CoCreateInstance(&clsid.unwrap(), None, Com::CLSCTX_ALL) };
println!("IDispatch: {:?}", obj);
}
通过这种方式,我可以获得一个IDispatch
对象,我应该能够查询可用的方法和属性。在调用这个低级别(非常接近于C-金属) API时遇到了问题。我找到了双赢调度板条箱,但这似乎与windows-rs
没有合作.:/
发布于 2022-07-13 15:05:12
我想做类似的事情: COM Office/Excel自动化使用Rust。
简单地说,我已经为IDispatch::GetIDsOfNames()
和IDispatch::Invoke()
构建了一个包装器,对于参数,我们可以使用VARIANT
。
以下资源帮助我建立了一个解决方案:
https://stackoverflow.com/questions/72606367
复制相似问题