WorkToolSmith

XDW_OpenDocumentHandleをDelphiで使用する

太田アベル

・ 更新 ・ 2分で読めます

当サイトの記事には一部に広告リンクが含まれます。

DocuWorksのファイルを開き、ハンドルを返すXDW_OpenDocumentHandleの移植からです。

function XDW_OpenDocumentHandle(const lpszFilePath: PChar; var pHandle: p_XDW_DOCUMENT_HANDLE;

pOpenMode: p_XDW_OPEN_MODE): Integer; stdcall;

返してくるハンドルの構造体は

  XDW_DOCUMENT_HANDLE = record

dummy: Integer;

end;

p_XDW_DOCUMENT_HANDLE = ^XDW_DOCUMENT_HANDLE;

と宣言しています。

さて、疑問があるのですがポインタに対して var は必要なのか?ということ。Cヘッダ移植のページをいろいろ見てやっているのですが、よくわかりません。

varを削除するとと動かなくなります。ということは必要だ、とすごい判断でやっていますがいいのでしょうか?

正しいことを知っている人はコメントください。

引数

で、もうひとつの引数pOpenModeですが、

  p_XDW_OPEN_MODE = ^XDW_OPEN_MODE;

XDW_OPEN_MODE = record

nSize: Integer;

nOption: Integer;

end;

このように宣言しなおし。

気をつけなければならないのは nSizeには渡す前に「構造体のサイズをいれなければならない」ことです。

なぜなら

  • XDW_OPEN_MODE
  • XDW_OPEN_MODE_EX

の2つがあるからですね。

  p_XDW_OPEN_MODE_EX = ^XDW_OPEN_MODE_EX;

XDW_OPEN_MODE_EX = record

nSize: Integer;

nOption: Integer;

nAuthMode: Integer;

end;

同じ引数に普通のものとEXと両方入れられるのです。EXの方は認証処理に対しての変数が含まれます。(int nAuthMode)

認証処理は必要でしょうから標準的にEXを渡すようにすればよいでしょう。

使用方法

var

Mode: p_XDW_OPEN_MODE_EX;

R: Integer;

begin

//XDW_OPEN_MODE_EXでAuthModeを使えるようにする

//実行時はキャストする

Getmem(Mode, Sizeof(XDW_OPEN_MODE_EX));

Mode^.nOption := InOption;

Mode^.nSize   := Sizeof(XDW_OPEN_MODE_EX);

Mode^.nAuthMode := InAuthMode;

R := XDW_OpenDocumentHandle(PChar(InFileName), FileHandle, p_XDW_OPEN_MODE(Mode));

Freemem(Mode);

if R <> 0 then

XDW_CloseDocumentHandle(FileHandle, XDW_NULL);

例外が起こった場合は0以外が返ります。
これでFileHandleに入ったハンドルでXDWファイルを編集することができます。

太田アベル

太田アベル

パソコンを7歳からいじり始めて40年。とにかくパソコンが好きです。気になった商品をほぼ自腹で買いまくってレビュー中!良かった点、悪かった点をズバズバ書きます。

𝕏 でフォロー プロフィールを見る

こちらもおすすめ