掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
とある機器のOCXからの関数での変数の扱いがわからないのでお助けください。 (ID:45469)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
当てずっぽう さん >OLEVariantを_PBy_Infoでキャストして取り扱ってもおkだと思います。 いくらなんでもそれはあり得ないです。↓こちらを参照。 Delphi 言語ガイド - メモリ管理 - 内部データ形式(Delphi) - バリアント型 http://docwiki.embarcadero.com/RADStudio/XE5/ja/%E5%86%85%E9%83%A8%E3%83%87%E3%83%BC%E3%82%BF%E5%BD%A2%E5%BC%8F#.E3.83.90.E3.83.AA.E3.82.A2.E3.83.B3.E3.83.88.E5.9E.8B >32 ビット プラットフォームでは、バリアントは、コードで決められた型の型コードと値(または値への参照)を含む 16 バイト レコードとして格納されます。 Mojicさん >エラーもでないし、中身は正しく入ってようなのですが 先にも述べましたが、ErrIDの値が気になります。また、中身が正しく入ってると思う理由は何でしょう? >Byte扱い出来ず、「V]の項目も色々ためしてみてるのですが ほぼ普通の配列として扱い、値を取り出すときに整数型の変数に入れるかキャストするだけですよ。 pBy_Info:=VarArrayCreate([0, 1047], varByte); これ↑も試しましたか? >使い方がが間違ってるのか、どれもうまくできず (試した数だけ、詳細に)何をやってどうなったか?を伝えてください。お願いします。 エラーが出た場合、メッセージはCtrl+Cで取得できるので、それを提示してください。 >VC6のサンプルを見ると(DLL版)実際?の中身みたいなのには >typedef struct _PBy_Info{ (以下略) このBy_Info構造体は、1024+4×3+8+2×2=1048byte となるので、Dimと一致しますね。 >こんな感じな様なのですが、すべてVBとかはByteで扱てるのか? 少なくとも、データを受け取る部分に関してはそうなのでしょう。 そこから先はVBのサンプルコードを見ていけば良いのではと思いますが、どうなってますか? また、VC6のサンプルはDLLを直に使っているようですが、それと同様にしてはいけないのですか? ------------------------------------------------------------------------------------ フォームにTButtonを2個、TMemoを1個置き、以下のコードで確認してみてください。 ・ ボタン1 はバリアントの配列を作らず、いきなりGetFInfoに与えてみます。 ・ ボタン2 はVBのようにバリアントの配列を作ってから、GetFInfoに渡します。 結果をお知らせ下さい。(バイナリダンプの部分はほどほどで結構です。) implementation {$R *.dfm} (* typedef struct _PBy_Info{ BYTE Minutiae[1024]; // データ格納バッファ 1024Byte long lengthMinutiae; // データサイズ long nMinutiae; // データの特徴数 long Quality; // 特徴点の品質 BYTE DeviceName[8]; // デバイス名 WORD DllMajor; // DLL MaVersion WORD DllMinor; // DLL MiVersion }By_Info, *PBy_Info; *) type long = Longint; PBy_Info = ^TBy_Info; TBy_Info = packed record Minutiae: array[0..1023] of BYTE; // データ格納バッファ 1024Byte lengthMinutiae: long; // データサイズ nMinutiae: long; // データの特徴数 Quality: long; // 特徴点の品質 DeviceName: array[0..7] of BYTE; // デバイス名 DllMajor: WORD; // DLL MaVersion DllMinor: WORD; // DLL MiVersion end; procedure TestRecord(AVariant: Variant; AStrings: TStrings); var By_Info: PBy_Info; L, H: Integer; Str: AnsiString; I: Integer; begin AStrings.Add(''); AStrings.Add('レコード型として調べてみる'); AStrings.Add(StringOfChar('-', 44)); By_Info:=VarArrayLock(AVariant); // バリアント配列のポインタを取得、ロック L:=Low(By_Info.Minutiae); H:=High(By_Info.Minutiae); AStrings.Add(Format('Minutiae: %dbyte', [Length(By_Info.Minutiae)])); for I:=L to H do begin Str:=Str+Format('%.2x',[By_Info.Minutiae[I]]); if ((I-L+1) mod 16)=0 then begin AStrings.Add(Str); Str:=''; end else begin Str:=Str+' '; end; end; if Str<>'' then AStrings.Add(Str); AStrings.Add(Format('lengthMinutiae: %d', [By_Info.lengthMinutiae])); AStrings.Add(Format('nMinutiae: %d', [By_Info.nMinutiae])); AStrings.Add(Format('Quality: %d', [By_Info.Quality])); SetLength(Str, SizeOf(By_Info.DeviceName)); Str:=StrMove(PAnsiChar(Str), PAnsiChar(@By_Info.DeviceName), SizeOf(By_Info.DeviceName)); AStrings.Add(Format('DeviceName: "%s", Length=%d', [Str, Length(Str)])); AStrings.Add(Format('DllMajor: %d', [By_Info.DllMajor])); AStrings.Add(Format('DllMinor: %d', [By_Info.DllMinor])); VarArrayUnlock(AVariant); // ロック解除 end; procedure TestVariantArray(AVariant: Variant; AStrings: TStrings); var L, H: Integer; Str: String; I: Integer; begin if VarIsArray(AVariant) then begin L:=VarArrayLowBound(AVariant, 1); H:=VarArrayHighBound(AVariant, 1); AStrings.Add(Format('バリアント配列です。要素数: %d、下: %d、上: %d',[H-L+1, L, H])); if (VarType(AVariant) and varTypeMask)=varByte then begin // 配列かどうかに関わらず型を判定 AStrings.Add('その型は、Byte型です。'); AStrings.Add(Format('生データ: %dbyte', [H-L+1])); Str:=''; for I:=L to H do begin Str:=Str+Format('%.2x',[Byte(AVariant[I])]); if ((I-L+1) mod 16)=0 then begin AStrings.Add(Str); Str:=''; end else begin Str:=Str+' '; end; end; if Str<>'' then AStrings.Add(Str); TestRecord(AVariant, AStrings); // Byte型の配列だったら、レコード型にして調べてみる end else begin AStrings.Add('その型は、Byte型ではありません。'); end; end else begin AStrings.Add('バリアント配列ではありません。'); end; end; // いきなりGetFInfoに突っ込んでみる場合 procedure TForm1.Button1Click(Sender: TObject); var V1: OLEVariant; ErrID: Integer; begin Memo1.Clear; V1:=Unassigned; // varEmptyにしておく ErrID:=AXSensor1.GetFInfo(V1); Memo1.Lines.Add(Format('ErrID: %d, V1: %s', [ErrID, VarTypeAsText(VarType(V1))])); TestVariantArray(V1, Memo1.Lines); end; // Variantの配列を作ってからGetFInfoに渡してみる場合 procedure TForm1.Button2Click(Sender: TObject); var V2: OLEVariant; ErrID: Integer; begin Memo1.Clear; V2:=VarArrayCreate([0, 1047], varByte); ErrID:=AXSensor1.GetFInfo(V2); Memo1.Lines.Add(Format('ErrID: %d, V2: %s', [ErrID, VarTypeAsText(VarType(V2))])); TestVariantArray(V2, Memo1.Lines); end;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.