7

ここで、Word 文書を保存せずに自動化によってファイル名を設定する方法について質問しましたRemou のおかげで、FileSummaryInfo-Dialog を呼び出して Title プロパティを設定することで、これを行う良い方法を受け取りました。

しかし今、クライアントが特別な文字 (ポイントとアンダースコア) を含むドキュメント名を持ちたいという問題があり、それは単語のバグ (または機能) のようで、タイトルを切り取り、前の文字のみを取ります。ファイル名を構築するための最初の特殊文字! 私はすでに多くのことをグーグルで検索しましたが、この問題の解決策を見つけることができませんでした. この問題はここでも指摘されていますが(落とし穴を参照)、解決策はありません。

保存せずにファイル名を設定するための別の解決策、または言及された奇妙な動作の回避策/バグ修正はありますか?

4

1 に答える 1

5

最近は私の手元以外に Windows マシンを持っていないので、easyhookを試してみてください。以下は単なるコールフローです(私が何年も前にしたことのようなもので、ソフトウェアのソケットバインドポートをDetoursによって別のものに変更しました)

CreateFileW のフックについて:

easyhook の 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" にマッピングされていることを知りません。このマッピング情報を取得するには多くの方法があります。1 つは、このマッピング情報をアプリ内の既知のファイルに保存し、そのファイルを Detoured 関数で読み取ることです。

于 2012-12-05T15:52:56.953 に答える