LotusNotes から Windows の証明書ストアにアクセスしたいのにできない

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 呼び出し的なあたりがよくわからない。