如何设置Word文档的文件名而不将其保存在c#和自动化II中

时间:2012-11-29 15:04:01

标签: ms-word office-interop

我已经问过here一个关于如何通过自动化设置Word文档的文件名而不保存它的问题。感谢Remou,通过调用FileSummaryInfo-Dialog并设置Title-property,我收到了很好的方法。

但是现在我遇到的问题是客户端想要在(点和下划线)中包含特殊字符的文档名称,而且它似乎是单词的一个错误(或一个功能),它会削减标题并且只会占用用于构建文件名的第一个特殊字符之前的字符!我已经google了很多,但无法找到解决此问题的方法。 问题也被注意到here(见问题),但没有解决方案。

有没有其他解决方案来设置文件名而不保存,或者针对上述奇怪行为的解决方法/错误修复?

1 个答案:

答案 0 :(得分:5)

试试easyhook,因为这些天我手上还没有Windows机器。 以下就是呼叫流程(就像我多年前做的那样,通过Detours将软件的套接字绑定端口改为不同的一个)

关于隐藏CreateFileW:

easyhook's wiki中的示例正是我们想要的。

CreateFileHook = LocalHook.Create(
                    LocalHook.GetProcAddress("kernel32.dll", "CreateFileW"),
                    new DCreateFile(CreateFile_Hooked),
                    this);

CreateFile_Hooked中,您可以更改参数InFileName,然后调用真实的CreateFileW

static IntPtr CreateFile_Hooked(
    String InFileName,
    UInt32 InDesiredAccess,
    UInt32 InShareMode,
    IntPtr InSecurityAttributes,
    UInt32 InCreationDisposition,
    UInt32 InFlagsAndAttributes,
    IntPtr InTemplateFile)
{
    // FIGURE OUT THE FILE NAME THAT YOU WANT HERE
    // IF the InFileName is not your Document name "My.doc", then call orignal CreateFile
    // with all the parameter unchanged.

    // call original API...
    return CreateFile(
        YOUR_CHANGED_FILE_NAME_HERE,
        InDesiredAccess,
        InShareMode,
        InSecurityAttributes,
        InCreationDisposition,
        InFlagsAndAttributes,
        InTemplateFile);
}

致电流程

将标题更改为“My_Document_2012_11_29”后, 然后挂钩Word进程的CreateFileW。 例如,当InFileName是“My.doc”时, 那么你应该把它改成“My_Document_2012_11_29”。

因为这是在Word进程中完成的,所以Detoured函数不知道 “My.doc”映射到“My_Document_2012_11_29”。 获取此映射信息有很多方法,一种是将此映射信息保存到 应用程序中的已知文件,并在Detoured函数中读取文件。