Ошибка 80040154 Класс не зарегистрирован - как исправить для ARX SAPILib.dll
Я успешно использовал CoSign в Microsoft Word, но теперь я пытаюсь автоматизировать создание отчетов с помощью Microsoft Visual Basic Studio 10 Express. Попытка загрузить комплект программного обеспечения разработчика не удалась из-за предыдущей установки клиента, но я уже вижу, что Arx Signature API 6.20 установлен на моем рабочем столе, и я могу без проблем добавить ссылку на Interop.SAPILib.dll через COM вкладка; Intellisense распознает все соответствующие функции, поэтому все вроде бы установлено. Однако при сборке и отладке программы появляется сообщение об ошибке 80040154 Класс не зарегистрирован, особенно при первом вызове "Dim myFileHandle as New SAPILibrary.FileHandle". Предыдущие звонки работают без ошибок; они включают создание MySAPI в качестве нового SAPICrypt, MyHandle в качестве нового объекта SESHandle, MyFieldHandle в качестве нового SAPILib.SigFieldSettings и вызовы MySAPI.init, MySAPI.HandleAquire, MySAPI.Logon. Мой код ниже.
В других сообщениях на форуме об этой ошибке указывается на необходимость обеспечения сборки x86 при использовании 32-разрядной библиотеки DLL. Я подтвердил, что это платформа компиляции моего решения; Я использую 64-разрядную версию Toshiba под управлением Windows 7.
Может ли это быть проблемой dll, так как ссылка на другой класс SAPILibrary работала хорошо? Разве установка Arx Cosign не регистрирует автоматически dll, несмотря на то, что я могу ссылаться на нее в Visual Stuio Express? Я попытался вручную зарегистрировать файл dll, но затем я получил сообщение об ошибке, что модуль был загружен, но точка входа DllRegisterServer не найдена, и проверить, является ли это действительной dll.
Очевидно, я новичок в COM DLL. Я на правильном пути, или это необработанная ошибка другого рода?
Private Sub SignWithSAPI()
Dim username As String = "XXX@yahoo.com"
Dim password As String = "passwordhere"
'add a signature field locator string - NEED TO HIDE THIS AS IT DOESN'T GET ERASED BY SAPI
Dim MyFieldLocatorString As String = "<<<W=200;H=120;N=Physician signature;A=&HC;>>>"
oWord.Selection.TypeText(MyFieldLocatorString)
'SIGN PDF HERE USING COSIGN Signature API
Dim mySAPI As New SAPICrypt
Dim myHandle As New SESHandle
Dim rc As Int32
rc = mySAPI.Init()
If rc <> 0 Then
MessageBox.Show("Init failed")
Exit Sub
End If
rc = mySAPI.HandleAcquire(myHandle)
If rc <> 0 Then
MessageBox.Show("failed at handleAcquire")
mySAPI.Finalize()
Exit Sub
End If
rc = mySAPI.Logon(myHandle, userName, "", password)
If rc <> 0 Then
MessageBox.Show("Login failed")
mySAPI.HandleRelease(myHandle)
mySAPI.Finalize()
Exit Sub
End If
Dim MyFieldSettings As New SAPILib.SigFieldSettings
With MyFieldSettings
.Invisible = 0
.Height = 200
.Width = 100
.AppearanceMask = myChosenAppearancesMask 'shows graphical image, name of signer and time
.SignatureType = SAPI_ENUM_SIGNATURE_TYPE.SAPI_ENUM_SIGNATURE_DIGITAL
End With
Dim myPDFfileName As String = "C:\\Users\Scott\Desktop\TestAutomation.pdf"
Dim myFileHandle As New SAPILib.FileHandle
rc = mySAPI.CreateFileHandleByName(myFileHandle, _
SAPI_ENUM_FILE_TYPE.SAPI_ENUM_FILE_ADOBE, 0, myPDFfileName)
If rc <> 0 Then
MessageBox.Show("Error in creating FileHandlebyName")
mySAPI.HandleRelease(myHandle)
mySAPI.Finalize()
Exit Sub
End If
'Assigns the SigFieldContext
Dim mySigFieldContext As New SAPIContext
Dim myNumberOfSigFields As Integer
rc = mySAPI.SignatureFieldEnumInitEx(myHandle, mySigFieldContext, _
SAPI_ENUM_FILE_TYPE.SAPI_ENUM_FILE_ADOBE, "", myFileHandle, 0, myNumberOfSigFields)
If rc <> 0 Then
MessageBox.Show("Error in SigFieldEnumInitEx")
mySAPI.HandleRelease(myFileHandle)
mySAPI.HandleRelease(myHandle)
mySAPI.Finalize()
Exit Sub
End If
Dim mySigFieldLocatorContext As New SAPIContext 'next line assigns its value in the function
rc = mySAPI.SignatureFieldLocatorEnumInit(myHandle, mySigFieldLocatorContext, _
myFileHandle, "<<<", ">>>", 0, myNumberOfSigFields)
If rc <> 0 Then
mySAPI.ContextRelease(mySigFieldContext)
MessageBox.Show("Error in SigFieldLocatorContext")
mySAPI.HandleRelease(myFileHandle)
mySAPI.HandleRelease(myHandle)
mySAPI.Finalize()
Exit Sub
End If
Dim mySigFieldHandle As New SigFieldHandle
rc = mySAPI.SignatureFieldEnumCont(myHandle, mySigFieldContext, mySigFieldHandle)
'assigns the first(only) value to mySigFieldHandle
If rc <> 0 Then
mySAPI.ContextRelease(mySigFieldLocatorContext)
mySAPI.ContextRelease(mySigFieldContext)
MessageBox.Show("Error in SigFieldLocatorContext")
mySAPI.HandleRelease(myFileHandle)
mySAPI.HandleRelease(myHandle)
mySAPI.Finalize()
Exit Sub
End If
'//Create the Field
rc = mySAPI.SignatureFieldSignEx(myHandle, mySigFieldHandle, myChosenAppearancesMask, _
Nothing)
If rc <> 0 Then
MessageBox.Show("Error in sigfieldSignEx")
End If
'release resources
mySAPI.HandleRelease(mySigFieldHandle)
mySAPI.HandleRelease(myFileHandle)
mySAPI.ContextRelease(mySigFieldContext)
mySAPI.ContextRelease(mySigFieldLocatorContext)
mySAPI.Logoff(myHandle)
mySAPI.HandleRelease(myHandle)
End Sub
Спасибо!
1 ответ
Объект FileHandle может быть создан с использованием любого CreateFileHandleByName
или же CreateFileHandleByMem
функции, и это правильный способ создания объекта в нашем COM. Замена линии Dim myFileHandle As New SAPILib.FileHandle
с Dim myFileHandle As SAPILib.FileHandle = Nothing
решит вашу проблему.