バイト配列型の引数について

解決


はると  2007-05-31 19:47:21  No: 26406

外部から提供されているオブジェクトを使用したいのですが、
その中に、

int NKGets( Byte Array型 Buff, int型 size, String型 filename )

という関数があります。
成功すれば、Buffに「データが格納されたByte型配列が格納される」という説明なのですが、
サンプルコードがVB用のものしかなく、
Delphiで扱う場合、この引数にどのような変数を渡せば良いのかが分かりません。

どなたか、お教えいただきますようお願いします。


あrr  2007-06-01 01:16:51  No: 26407

こんなんかな?

function NKGets(
 var buff:array of Byte;
 size: integer;
 filename:String ): Integer;

TByteArrayなどの型もあります。Helpで配列型を参照


はると  2007-06-01 05:30:03  No: 26408

var
  rc : Integer;
  Buff : ??????????????? <--- この型をどうすればよいのか分からない
  size : Integer;
  filename : String;
begin
  size := 10000;
  rc := NKGets( Buff, size, filename );
end; 

問題の関数を、上のように、単純にDelphiから呼び出したいということです。
この時、Buffをどのようにすれば良いのかが分かりません。
Array of Byte
Variant
OLEVariant
などで試行錯誤したのですが、いずれもうまくいきません。


bvc  2007-06-01 06:18:11  No: 26409

buff:array of Byte;
setlengthで長さを指定する。

Helpで動的配列を参照して少しでも理解してから試行錯誤したほうがいい。

Byte Array型 Buff  と説明があり、それが正確なら、
それはByte型の配列であると思われます。

array of Byte;
でうまくいかないのはsetlengthしてないからでは?


Fusa  2007-06-01 06:18:28  No: 26410

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
と順番に表示されます。


はると  2007-06-01 07:15:27  No: 26411

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;

これで何かお分かりであれば、何卒よろしくお願いします。


TS  2007-06-01 17:31:00  No: 26412

単純な var buff:array of Byte;ではなく
ポインタみたいですね
type buff:array of Byte;
     Pbuff:^buff;
function NKGets(var P:Pbuff;size:integer;filename:String ): Integer;


あrr  2007-06-01 20:05:36  No: 26413

activexにPSafeArrayてのがあるね。それ使えないのかい?


はると  2007-06-02 07:28:35  No: 26414

ご協力ありがとうございました。
結果的には、PSafeArray型でうまく稼動いたしました。

コンパイル時に「E2281 この型は Variant ディスパッチ呼び出しでは使えません」
というエラーが出るのは、そもそも、COMオブジェクトの実装の仕方に問題があったようです。
COMやActiveXなどの扱いには不慣れでして、問題の所在を誤ってしまったことになります。
なにとぞご容赦下さい。
今回の件で、一つスキルアップできました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加