XDW_OpenDocumentHandleをDelphiで使用する

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ファイルを編集することができます。