外部から提供されているオブジェクトを使用したいのですが、
その中に、
int NKGets( Byte Array型 Buff, int型 size, String型 filename )
という関数があります。
成功すれば、Buffに「データが格納されたByte型配列が格納される」という説明なのですが、
サンプルコードがVB用のものしかなく、
Delphiで扱う場合、この引数にどのような変数を渡せば良いのかが分かりません。
どなたか、お教えいただきますようお願いします。
こんなんかな?
function NKGets(
var buff:array of Byte;
size: integer;
filename:String ): Integer;
TByteArrayなどの型もあります。Helpで配列型を参照
var
rc : Integer;
Buff : ??????????????? <--- この型をどうすればよいのか分からない
size : Integer;
filename : String;
begin
size := 10000;
rc := NKGets( Buff, size, filename );
end;
問題の関数を、上のように、単純にDelphiから呼び出したいということです。
この時、Buffをどのようにすれば良いのかが分かりません。
Array of Byte
Variant
OLEVariant
などで試行錯誤したのですが、いずれもうまくいきません。
buff:array of Byte;
setlengthで長さを指定する。
Helpで動的配列を参照して少しでも理解してから試行錯誤したほうがいい。
Byte Array型 Buff と説明があり、それが正確なら、
それはByte型の配列であると思われます。
array of Byte;
でうまくいかないのはsetlengthしてないからでは?
procedure PlusValue(var Values: array of Integer; Plus: Integer);
var
i: Integer;
begin
if Length(Values) = 0 then
raise ERangeError.Create('引数の数が足りません');
for i := 0 to High(Values) do
begin
Values[i] := Values[i] + Plus;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
AAA: array of Integer;
i: Integer;
begin
SetLength(AAA, 3);
for i := 0 to 2 do
begin
AAA[i] := 100 + i;
end;
PlusValue(AAA, 51);
for i := 0 to 2 do
begin
ShowMessage(IntToStr(AAA[i]));
end;
end;
メッセージが
51, 52, 53
と順番に表示されます。
Array of Byteにして、SetLength でサイズを割り当てて渡した場合、コンパイル時に「E2281 この型は Variant ディスパッチ呼び出しでは使えません」となってしまいました。
残念ながら、私のスキルでは”ディスパッチ呼び出し”というだけでお手上げの状態です。
順番が逆になってしまったかも知れませんが、タイプライブラリの同関数の部分の内容をお示しします。
INKShare = interface(IDispatch)
['{501A40F3-9761-3106-A3B1-E75C5FC16257}']
function NKGets(out buff: PSafeArray; size: Integer; out fileName: WideString): Integer; safecall;
INKShareDisp = dispinterface
['{501A40F3-9761-3106-A3B1-E75C5FC16257}']
function NKGets(out buff: {??PSafeArray}OleVariant; size: Integer; out fileName: WideString): Integer; dispid 1610743816;
これで何かお分かりであれば、何卒よろしくお願いします。
単純な var buff:array of Byte;ではなく
ポインタみたいですね
type buff:array of Byte;
Pbuff:^buff;
function NKGets(var P:Pbuff;size:integer;filename:String ): Integer;
activexにPSafeArrayてのがあるね。それ使えないのかい?
編集 削除ご協力ありがとうございました。
結果的には、PSafeArray型でうまく稼動いたしました。
コンパイル時に「E2281 この型は Variant ディスパッチ呼び出しでは使えません」
というエラーが出るのは、そもそも、COMオブジェクトの実装の仕方に問題があったようです。
COMやActiveXなどの扱いには不慣れでして、問題の所在を誤ってしまったことになります。
なにとぞご容赦下さい。
今回の件で、一つスキルアップできました。