FT245R USB to Parallel FIFO Interface Device を使用しています。チップは FTDI D2XX ライブラリを使用します。ライブラリ関数を読み込んでアクセスするために、powershell と DllImport を使用しています。FT_ListDevices 関数の使用に問題があります。デバイスのリファレンスと例は、以下のリンクにあります。11ページ、12ページ、13ページの一部参照
http://www.ftdichip.com/Support/Documents/ProgramGuides/D2XX_Programmer's_Guide(FT_000071).pdf _
同僚と私は 2 番目の例を機能させることができましたが、3 番目の例はうまくいきませんでした。以下は動作するコードです。3 番目の例は以下の例と似ていますが、以下の作業コードのようにバイト配列の代わりに配列の配列を使用しています。
#2. Get serial number of first device
$FT_LIST_BY_INDEX = '0x40000000'
$FT_OPEN_BY_SERIAL_NUMBER = 1
$numDevs = 0
$SerialNumber = New-Object byte[] 64
$run=@'
[DllImport("FTD2XX.dll")] static public extern UInt32 FT_ListDevices(System.IntPtr pvArg1, byte[] pvArg2, System.UInt32 dwFlags);
'@
$typef = Add-Type -MemberDefinition $run -Name "ListDevices" -PassThru
$typef::FT_ListDevices($numDevs, $SerialNumber, $FT_LIST_BY_INDEX -bor $FT_OPEN_BY_SERIAL_NUMBER)
[System.Text.Encoding]::ASCII.GetString($SerialNumber)
例 3 を機能させる最善の試みを以下に示します。
#3. Get device descriptions of all devices currently connected
$FT_LIST_ALL = '0x20000000'
$FT_OPEN_BY_SERIAL_NUMBER = 1
$FT_OPEN_BY_DESCRIPTION = 2
$numDevs = 0
$TotalnumDevs = 2
[Byte[][]]$BufferPtrs = (,([Byte[]] (,"" * 64)))*$TotalnumDevs
[Byte[][]]$BufferPtrs += ,""
$run=@'
[DllImport("FTD2XX.dll")] static public extern UInt32 FT_ListDevices(Array BufferPtrs, ref UInt32 pvArg2, UInt32 dwFlags);
'@
$typef = Add-Type -MemberDefinition $run -Name "ListDevices1" -PassThru
$ftStatus = $typef::FT_ListDevices($BufferPtrs, [ref] $numDevs, $FT_LIST_ALL -bor $FT_OPEN_BY_DESCRIPTION)
'(FT_OK = 0) ftStatus = ' + [string]$ftStatus
'Number of Devices = ' + [string]$numDevs
[ref] $BufferPtrs #Display the Pointers Array
$BufferPtrs.GetType()
したがって、ここでの目標は、DLLimport ステートメントで Array を Byte[][] に変更することですが、
これはエラーになります。. .
エラー: 「ネストされた配列のマーシャリング サポートはありません」
いくつかの調査を行い、カスタム マーシャリングを使用しようとしましたが、別のエラーが発生しました。
エラー: 「型または名前空間名 'ICuztomMarshaler' が見つかりませんでした」
これを機能させるには、ジャグ/ネストされた配列をライブラリに送信できる必要があります
。
どうぞよろしくお願いいたします。J・ウェイド