我想在程序里和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到服务器上,程序运行正常,如下图。