Search code examples
cosign-api

Error 80040154 Class not registered - how to fix for ARX SAPILib.dll


I've been using CoSign within Microsoft Word successfully, but now I'm trying to automate the report generation using Microsoft Visual Basic Studio 10 Express. Trying to download the developer's software bundle fails due to the previous client installation, but I do already see the Arx Signature API 6.20 installed on my desktop, and I can add a reference to the Interop.SAPILib.dll without a problem, through the COM tab; Intellisense recognizes all the appropriate functions, so everything seemed to be installed. However, when I build and debug the program, I am given the error 80040154 Class not registered, specifically on the first "Dim myFileHandle as New SAPILibrary.FileHandle" call. Previous calls work without error; they include creating MySAPI as a New SAPICrypt, MyHandle as a new SESHandle object, MyFieldHandle as new SAPILib.SigFieldSettings, and calls to MySAPI.init, MySAPI.HandleAquire, MySAPI.Logon. My code is below.

Other forum posts for this error cite the need for assuring x86 builds if using a 32-bit dll. I have confirmed that it is my solution's compile platform; I am using a 64-bit Toshiba running Windows 7.

Can it be a dll issue, since the other SAPILibrary class reference worked well? Does the Arx Cosign installation not automatically register the dll, despite my being able to reference it in Visual Stuio Express? I tried to manually register the dll file, but I'm then given the error that the module was loaded but that the entry point DllRegisterServer was not found, and to check to see if this is a valid dll.

Obviously I'm new to COM dlls. Am I on the right track, or is this an unhandled error of another kind?

 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

Thanks!


Solution

  • The FileHandle object can be created using either CreateFileHandleByName or CreateFileHandleByMem functions and this is the proper way to instantiate the object in our COM. Replacing the line Dim myFileHandle As New SAPILib.FileHandle with Dim myFileHandle As SAPILib.FileHandle = Nothing will solve your issue.