掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
とある機器のOCXからの関数での変数の扱いがわからないのでお助けください。 (ID:45473)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
16進のWORD値だけでなく、ByRef/Arrayも毎回結果がぜんぜん違うじゃないですか(怒) そういう大事なことは伏せておかないで下さい。一つだけ示されれば、それしかないと思ってしまいます! 他にもいろいろガミガミ言いたいことはありますが、それを言い始めると終わらないので(以下略) …というか、こりゃーバリアントじゃないですね。タイプライブラリにすっかりだまされました。 SDKマニュアルの方にはバリアントなんて一切書いてないですし。 まあ、VBがバイト型配列なのはナゼ?と思ってたので、可能性はあったんですが。 そして、当てずっぽう さんがこれを予言した形になりました。 50%くらいは当たってます。失礼しました。でも理由は違いますねー。 ですからOleVariantに関することは一切忘れ、昨日の時点にさかのぼって >PBy_Infoをキャストしたいのですが、そのキャスト方法がわかりません。 この方針で良いと思います。 SDKそのものはライセンスが必要みたいですが、SDKのマニュアルは公開情報なんですね。 ですので、あえてそれをコードに反映させてみます。 マニュアル・セキュリティ製品[RATOC] - ラトックシステム http://www.ratocsystems.com/services/manual/security.html Function GetFingerInfo(ByRef pSRexInfo As Object) As Integer VB.NETではこう書いてありましたが、pSRexInfoはSRexInfoのミスプリじゃないかと思います。 DLL直の引数とか、CompFingerInfoはSRexInfoだ、とか全体の状況証拠的にですけど。 implementation {$R *.dfm} type long = Longint; // SREX_INFO 指紋情報構造体 PSREX_INFO = ^TSREX_INFO; TSREX_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 TestRecordEx(Info: TSREX_INFO; AStrings: TStrings); var L, H: Integer; Str: AnsiString; I: Integer; begin AStrings.Add(''); L:=Low(Info.Minutiae); H:=High(Info.Minutiae); AStrings.Add(Format('Minutiae: %dbyte', [Length(Info.Minutiae)])); for I:=L to H do begin Str:=Str+Format('%.2x',[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(StringOfChar('-', 44)); AStrings.Add(Format('lengthMinutiae: %d', [Info.lengthMinutiae])); AStrings.Add(Format('nMinutiae: %d', [Info.nMinutiae])); AStrings.Add(Format('Quality: %d', [Info.Quality])); SetLength(Str, SizeOf(Info.DeviceName)); Str:=StrMove(PAnsiChar(Str), PAnsiChar(@Info.DeviceName), SizeOf(Info.DeviceName)); AStrings.Add(Format('DeviceName: "%s", Length=%d', [Str, Length(Str)])); AStrings.Add(Format('DllMajor: %d', [Info.DllMajor])); AStrings.Add(Format('DllMinor: %d', [Info.DllMinor])); end; procedure TForm1.Button1Click(Sender: TObject); var ErrID: Integer; By_Info: TSREX_INFO; begin Memo1.Clear; // ErrID:=AXSensor1.GetFingerInfo(OleVariant(PVarData(@By_Info)^)); ErrID:=AXSensor1.GetFingerInfo(POleVariant(@By_Info)^); Memo1.Lines.Add(Format('ErrID: %d', [ErrID])); TestRecordEx(By_Info, Memo1.Lines); end;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.