LotusNotes から Windows の証明書ストアにアクセスするの続き。
Windows XP だけでしか動かないというのも悔しいので他の Windows でも動けばいいなと CryptoAPI 経由でのアクセスに挑戦してみたのですが駄目でした。
LotusScript はかなり VisualBasic に似ているので、ほぼその作法が通用します。
というわけでこんな感じで CryptoAPI 経由で証明書ストアにアクセスしようとしました。
Option Public Public Const CERT_NAME_SIMPLE_DISPLAY_TYPE = 4 Public Const CERT_NAME_ISSUER_FLAG = &H1 Declare Function CertOpenSystemStore Lib "Crypt32.dll" Alias "CertOpenSystemStoreA" (_ Byval hprov As Long, _ Byval szSubsystemProtocol As String ) As Long Declare Function CertEnumCertificatesInStore Lib "Crypt32.dll" Alias "CertEnumCertificatesInStore"( _ Byval hCertStore As Long, _ Byval pPrevCertContext As Long) As Long Declare Function CertGetNameString Lib "crypt32.dll" Alias "CertGetNameStringA" ( _ pCertContext As Long, _ Byval dwType As Long, _ Byval dwFlags As Long, _ pvTypePara As Any, _ Byval pszNameString As String, _ Byval cchNameString As Long) As Long Sub Initialize Dim szBuf As String szBuf = Space(1024) Dim store As Long store = CertOpenSystemStore(0,"MY") Dim pContext As Long pContext = CertEnumCertificatesInStore(store, 0) Dim Result As Long Result = CertGetNameString(pContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, CERT_NAME_ISSUER_FLAG, Null, szBuf, 1024) Messagebox szBuf End Sub
Declare のところ、LotusScript では明示しなければ参照渡しになるので ByRef は書きません。
これで動かすと、CertGetNameString のところでクラッシュします。
CertEnumCertificatesInStore から帰ってくるのが構造体なのですが、その構造体をうまくハンドリングできてないのかなあ。
ネットで検索してみると、VB6 で同じようなことに挑戦してる人がいましたが、やはり同じく CertGetNameString のところでクラッシュするようです。
LotusScript に起因する問題じゃなくて、呼び出し方か値の渡し方がまずいようですけどこれ以上追う方法がわからなくて断念しました。
くやしいのう。VB6 から DLL 呼び出し的なあたりがよくわからない。