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