blochの日記

自虐ネタ以外のぐちは書かないようにしましょう

typedef続き

370423a.pdfのVBの例題Example2-1のお次の関数は、
stat = viOpen(dfltRM, "GPIB0::1::INSTR", VI_NULL, VI_NULL, sesn)
である。stat=ViStatus=long、dfltRM=ViSession=longwordであることは既にわかっている。
まず、最後の引数sesnは、プログラム上(visa32.basではない)で
Dim sesn As ViSession
と定義されているので、longwordで良い。次に、VI_NULLは、今度はvisa32.bas上で、
Global Const VI_NULL=0
と定義されているので、ゼロで良いとわかる。問題は次の文字列定数で、これの型は何だろうか。少し先回りして、
stat = viRead(sesn, buffer, MAX_CNT, retCount)
を見ると、文字列変数bufferが使われており、プログラム中の定義では、
Dim buffer As String * MAX_CNT
となっている。VBでの単純な文字列で良いらしい。VBの文字列変数の構造がわからないので、visa.hを見ると、
ViStatus _VI_FUNC viOpen(ViSession sesn, ViRsrc name, ViAccessMode mode,ViUInt32 timeout, ViPSession vi);
となっていて、二番目の変数nameはViRsrc nameという型なのだが、これはvisatype.hで、
typedef ViString ViRsrc;
と定義されていて、さらにViStringは、
typedef ViPChar ViString;
であり、ViPcarは、さらにさらに、
typedef ViChar _VI_PTR ViPChar;
となっていて、また怪しい型キャストが居る。ともかく、ViCharは、
typedef char ViChar;
であり、結局、charであり、charへのポインタらしいのだがどうやって定義しようか。