我想在程序里和Word交互。老师跟我说不要学COM,因为它已经过时了。但是我不想再把代码移植到C#上面,然后用VSTO——已经用了std::unordered_set!因为我使用了Copilot,结合我的思考,写了下面的代码:
#import "libid:2DF8D04C-5BFA-101B-BDE5-00AA0044DE52" // mso.dll
#import "libid:0002E157-0000-0000-C000-000000000046" // vbe6ext.olb
#import "libid:00020905-0000-0000-C000-000000000046" rename("ExitWindows", "WordExitWindows") // msword.olb
#include <stdio.h>
#include <comdef.h>
int main()
{
if (CoInitialize(NULL) != S_OK) {
fprintf(stderr, "初始化 COM 库失败!");
return -1;
}
try {
Word::_ApplicationPtr pWordApp;
pWordApp.CreateInstance(__uuidof(Word::Application));
Word::_DocumentPtr pDoc = pWordApp->Documents->Add();
Word::RangePtr pRng = pDoc->Content;
pRng->Text = "世界你好!";
pRng->Font->Name = "新宋体";
pRng->Font->Size = 14;
pRng->Text += "你好福大!";
pWordApp->Visible = VARIANT_TRUE;
} catch (const _com_error& e) {
fprintf(stderr, "COM 错误:%s", e.ErrorMessage());
}
CoUninitialize();
return 0;
}
由于考虑不同版本库位置的差异,因此直接使用CLSID标识这些库。可以在注册表编辑器里面查到这些CLSID。最终运行效果如下:
其实认真阅读就可以发现,代码刚好概括了使用鼠标进行的Word操作。
这份代码目前看上去可以在Windows上移植。我使用的Word是2021版本的,64位
在弹性云服务器上安装了Word 32位,把发布版本的程序scp到服务器上,程序运行正常,如下图。