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