VBの「varptr」の代用


ユッケ  2009-11-16 11:13:19  No: 36180  IP: 192.*.*.*

VisualBasicで使用されている「VarPtr」という関数?があります。
処理内容は
「変数のアドレスを長整数型(long)で返します。
  変数名に指定できるのは、ユーザ定義データ型 / 整数型(integer) / 長整数型(long) / integer の配列 / long の配列 / 文字列型(string) です。
  この関数はDLL呼び出しの時に変数のアドレスを渡したいときに使用します。」
だそうです。

これがDelphiでは使用出来ないっぽいので、他に代用出来る方法・関数を知っている方、お手数ですが教えてほしいのですが。

ことの発端はプリンタの設定をファイルに保存し、後々にそのファイルから復元を行うというプログラムで、RICOHやCANONなどの独自の設定部分を各サイトのAPIを使用して取得・保存しようという処理の中で、「CopyMemory」と言う処理が出てきて、そこでVarPtrを使用しているからです。

私自身ポインタに一度も触れた事もなかったので、大変悩んでいます。

よろしくお願いします。

編集 削除
igy  2009-11-16 12:54:13  No: 36181  IP: 192.*.*.*

外しているかもしれませんが、
@ 演算子
は、いかがですか?

var
     X, Y: Integer;   // X と Y は Integer 型の変数
     P: ^Integer;     // P は Integer を指す
begin
     X := 17;         // X に値を代入する
     P := @X;         // X のアドレスを P に代入する
     Y := P^;         // P を逆参照して結果を Y に代入する
 end;

編集 削除
tor  2009-11-18 19:25:50  No: 36182  IP: 192.*.*.*

ちなみにCopyMemoryに相当する関数として、DelphiにはMoveがあります。
(厳密に言うと、領域の重なりを考慮するのでMoveMemoryに近いですが)
こちらはポインタではなく変数をそのままとります。後はSourceとDestinationが逆。
CopyMemory(@Y, @X, SizeOf(X)) は
Move(X, Y, SizeOf(X)) と書くことができます。

編集 削除