名著『大村あつしのExcel VBA Win64/32 API プログラミング』に誤植???

誤植?

f:id:akashi_keirin:20190105203721j:plain

おなじみ、『大村あつしのExcel VBA Win64/32 API プログラミング』に、誤植かも知れない箇所を発見したので、ご報告。

すでに出版元のWebページ等で訂正されているかも知れないが、そこは調べていない。(←調べろ。)

134~135ページ

当該書籍(以下「本書」という。)の134~135ページにSHGetPathFromIDList関数を宣言するコードが掲載されている。

'SHBrowseForFolderで取得した値からフォルダのフルパスを取得する関数'
'戻り値    成功 = NOERROR(0)'
'          失敗 = E_INVAILEDARG(=&H80070057)'
Declare PtrSafe Function SHGetPathFromIDList Lib "shell32.dll" _
    Alias "SHGetPathFromIDListA" _
    (ByVal pidl As Long, _
     ByVal PtrSafe As String) As LongPtr    '……(*)'

(「……(*)」は引用者による。)

(*)の

ByVal PtrSafe As String

は間違いだと思う。

PtrSafeのところに入る引数(変数)には、この関数を実行したときに固定長の文字列(取得したフォルダパス)が格納される模様なので、上掲コードの「PtrSafe」の部分を、それらしい識別子で置き換えなければならない。

とりあえず、私は、本書133ページに掲載されている構造体(SHBrowseForFolder関数に渡す引数)「BROWSEINFO」の要素名から取って「pszDispName」としている。

修正後のコード

修正後のコードを載っけておく。ただし、ご利用は自己責任で。

リスト1 標準モジュール
'For 64bit'
Declare PtrSafe Function SHGetPathFromIDList Lib "shell32.dll" _
    Alias "SHGetPathFromIDListA" _
    (ByVal pidl As Long, _
     ByVal pszDispName As String) As LongPtr
'For 32bit'
Declare Function SHGetPathFromIDList Lib "shell32.dll" _
    Alias "SHGetPathFromIDListA" _
    (ByVal pidl As Long, _
     ByVal pszDispName As String) As Long

上が64bit用、下が32bit用です。

おわりに

所詮、素人なので、間違えていたら教えろ教えてください。

出版元や筆者からお礼に記念品、とか言われたら、遠慮なくいただきますw