Access violation in CoCreateInstance creating a COM Object

229 Views Asked by At

I'm trying to communicate with a research spectrometer of a manufacturer I rather not say.

The manufacturer has provided some DLLs and example projects in Visual C++ 6 but apperently the support for them is not existant. I was able to compile with VS 2017 and 2022. It's based around the MFC with ATL support. But when creating a new project according to the manufacturer manual, both in VS 2022 & 2017, with the same project properties the code does throw an access violation error when calling CoCreateInstance.

Does anybody have an idea what causes the problem and why it works for the example code? The first CoCreateInstance in LoadMono() works flawless, my code breaks in the initialization afterwards. The clsid looks fine. I assume the problem has to do with the IJYMonoReqd which cannot be accessed apperently.

Below is my code. For readability I removed much of the Wizard generated code:

// MFCAppDlg.cpp:
//

#include "pch.h"
#include "framework.h"
#include "MFCApp.h"
#include "MFCAppDlg.h"
#include "DlgProxy.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CAboutDlg-Dialog "Info"

class CAboutDlg : public CDialogEx
{
...
};

CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
...
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CMFCAppDlg-MainDialog


IMPLEMENT_DYNAMIC(CMFCAppDlg, CDialogEx);

CMFCAppDlg::CMFCAppDlg(CWnd* pParent /*=nullptr*/)
    : CDialogEx(IDD_MFCAPP_DIALOG, pParent)
{
..
    m_jyMono = NULL;
}

CMFCAppDlg::~CMFCAppDlg()
{
...
}

void CMFCAppDlg::DoDataExchange(CDataExchange* pDX)
{
...
}

BEGIN_MESSAGE_MAP(CMFCAppDlg, CDialogEx)
...
END_MESSAGE_MAP()


BOOL CMFCAppDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    ...
    // TODO: Additional Init
    LoadMonos();

    //create an instance of the mono object
    HRESULT hr = S_OK;
    CLSID clsid;
    if (m_jyMono == NULL)
    {
        hr = CLSIDFromProgID(L"JYMono.Monochromator", &clsid);
        hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, __uuidof(IJYMonoReqd), (void**)&m_jyMono); //breaks here
        if (FAILED(hr)
        {
            TRACE("Failed to create Mono Object. Err: %ld", hr);
            return FALSE;
        }
    }
    return TRUE;
}

...

void CMFCAppDlg::LoadMonos()
{
    USES_CONVERSION;
    IJYConfigBrowerInterface* pConfigBrowser;
    HRESULT hr = CoCreateInstance(__uuidof(JYConfigBrowerInterface),
        NULL, CLSCTX_INPROC_SERVER,
        __uuidof(IJYConfigBrowerInterface),
        (void**)&pConfigBrowser);
    pConfigBrowser->Load();
    CComBSTR name, monoID;


    bool bMore = true;

    int i = 0;
    pConfigBrowser->GetFirstMono(&name, &monoID);
    m_monoArray[i][0] = W2A(monoID);
    m_monoArray[i][1] = W2A(name);
    i++;


    CString strName, strMonoID;
    pConfigBrowser->GetNextMono(&name, &monoID);

    while (true)
    {
        strName = W2A(name);
        strMonoID = W2A(monoID);

        if (strName.IsEmpty() && strMonoID.IsEmpty())
            break;

        m_monoArray[i][0] = strMonoID;
        m_monoArray[i][1] = strName;
        i++;
        pConfigBrowser->GetNextMono(&name, &monoID);
    }

}

and the header:

// MFCAppDlg.h: Headerfile
//

#pragma once

class CMFCAppDlgAutoProxy;


#import "C:\Program Files (x86)\Jobin Yvon\Common\JY Components\JYSupport\jysystemLib.dll" raw_interfaces_only, raw_native_types, no_namespace, named_guids

#import "C:\Program Files (x86)\Jobin Yvon\Common\JY Components\JYSupport\JYConfigBrowserComponent.dll" raw_interfaces_only, raw_native_types, no_namespace, named_guids

// CMFCAppDlg-Dialog
class CMFCAppDlg : public CDialogEx
{
    DECLARE_DYNAMIC(CMFCAppDlg);
    friend class CMFCAppDlgAutoProxy;

// Construction
public:
    CMFCAppDlg(CWnd* pParent = nullptr);    // Standardkonstruktor
    virtual ~CMFCAppDlg();

#ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_MFCAPP_DIALOG };
#endif

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV-Unterstützung

// Implementation
protected:
    CMFCAppDlgAutoProxy* m_pAutoProxy;
    HICON m_hIcon;
    BOOL CanExit();
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    afx_msg void OnClose();
    virtual void OnOK();
    virtual void OnCancel();
    DECLARE_MESSAGE_MAP()
private:
    //Mono functions
    void LoadMonos();

    CString m_monoArray[10][2];
    IJYMonoReqd *m_jyMono;
};

I tried so far:

  1. Reregisterd DLLs
  2. Tried a different VS version. There seems to be a problem coming from older V Studios with COM implementation and using VS 2017 worked for some users.
  3. Checked launch access for COM Objects in oleview

EDIT:

The Call stack looks like this:

    02d11004()  Unknown No symbols loaded.
[Frames below may be incorrect and/or missing]      Annotated Frame
user32.dll!__InternalCallWinProc@20()   Unknown Non-user code. Symbols loaded.
user32.dll!UserCallWinProcCheckWow()    Unknown Non-user code. Symbols loaded.
user32.dll!CallWindowProcAorW(long ,struct HWND__ *,enum _WM_VALUE,unsigned int,long,int)   Unknown Non-user code. Symbols loaded.
user32.dll!_CallWindowProcA@20()    Unknown Non-user code. Symbols loaded.
mfc140d.dll!_AfxActivationWndProc(HWND__ * hWnd=0x000a04f0, unsigned int nMsg=129, unsigned int wParam=0, long lParam=3854696) Line 478 C++ Non-user code. Symbols loaded.
user32.dll!__InternalCallWinProc@20()   Unknown Non-user code. Symbols loaded.
user32.dll!UserCallWinProcCheckWow()    Unknown Non-user code. Symbols loaded.
user32.dll!DispatchClientMessage()  Unknown Non-user code. Symbols loaded.
user32.dll!__fnINLPCREATESTRUCT()   Unknown Non-user code. Symbols loaded.
ntdll.dll!_KiUserCallbackDispatcher@12()    Unknown Non-user code. Symbols loaded.
user32.dll!CreateWindowInternal()   Unknown Non-user code. Symbols loaded.
user32.dll!_CreateWindowExA@48()    Unknown Non-user code. Symbols loaded.
JYMono.dll!100476c2()   Unknown Non-user code. Binary was not built with debug information.
JYMono.dll!10043562()   Unknown Non-user code. Binary was not built with debug information.
JYMono.dll!10042bc9()   Unknown Non-user code. Binary was not built with debug information.
JYMono.dll!100fa0c0()   Unknown Non-user code. Binary was not built with debug information.
JYMono.dll!100fa08b()   Unknown Non-user code. Binary was not built with debug information.
JYMono.dll!10042239()   Unknown Non-user code. Binary was not built with debug information.
JYMono.dll!10042443()   Unknown Non-user code. Binary was not built with debug information.
combase.dll!CServerContextActivator::CreateInstance(IUnknown * pUnkOuter=0x00000000, IActivationPropertiesIn * pInActProperties=0x003ade94, IActivationPropertiesOut * * ppOutActProperties=0x003ae52c) Line 881    C++ Non-user code. Symbols loaded.
combase.dll!ActivationPropertiesIn::DelegateCreateInstance(IUnknown * pUnkOuter=0x00000000, IActivationPropertiesOut * * ppActPropsOut=0x003ae52c) Line 1931    C++ Non-user code. Symbols loaded.
combase.dll!CApartmentActivator::CreateInstance(IUnknown * pUnkOuter=0x00000000, IActivationPropertiesIn * pInActProperties=0x003ade94, IActivationPropertiesOut * * ppOutActProperties=0x003ae52c) Line 2189   C++ Non-user code. Symbols loaded.
combase.dll!CProcessActivator::CCICallback(unsigned long dwContext=1, IUnknown * pUnkOuter=0x00000000, ActivationPropertiesIn * pActIn=0x003adcc0, IActivationPropertiesIn * pInActProperties=0x003ade94, IActivationPropertiesOut * * ppOutActProperties=0x003ae52c) Line 1645 C++ Non-user code. Symbols loaded.
combase.dll!CProcessActivator::AttemptActivation(ActivationPropertiesIn * pActIn=0x003adcc0, IUnknown * pUnkOuter=0x00000000, IActivationPropertiesIn * pInActProperties=0x003ade94, IActivationPropertiesOut * * ppOutActProperties=0x003ae52c, HRESULT(__stdcallCProcessActivator::*)(unsigned long, IUnknown *, ActivationPropertiesIn *, IActivationPropertiesIn *, IActivationPropertiesOut * *) pfnCtxActCallback=0x765a0cb0, unsigned long dwContext=1) Line 1527    C++ Non-user code. Symbols loaded.
combase.dll!CProcessActivator::ActivateByContext(ActivationPropertiesIn * pActIn=0x003adcc0, IUnknown * pUnkOuter=0x00000000, IActivationPropertiesIn * pInActProperties=0x003ade94, IActivationPropertiesOut * * ppOutActProperties=0x003ae52c, HRESULT(__stdcallCProcessActivator::*)(unsigned long, IUnknown *, ActivationPropertiesIn *, IActivationPropertiesIn *, IActivationPropertiesOut * *) pfnCtxActCallback=0x765a0cb0) Line 1393   C++ Non-user code. Symbols loaded.
combase.dll!CProcessActivator::CreateInstance(IUnknown * pUnkOuter=0x00000000, IActivationPropertiesIn * pInActProperties=0x003ade94, IActivationPropertiesOut * * ppOutActProperties=0x003ae52c) Line 1271 C++ Non-user code. Symbols loaded.
combase.dll!ActivationPropertiesIn::DelegateCreateInstance(IUnknown * pUnkOuter=0x00000000, IActivationPropertiesOut * * ppActPropsOut=0x003ae52c) Line 1931    C++ Non-user code. Symbols loaded.
combase.dll!CClientContextActivator::CreateInstance(IUnknown * pUnkOuter=0x00000000, IActivationPropertiesIn * pInActProperties=0x003ade94, IActivationPropertiesOut * * ppOutActProperties=0x003ae52c) Line 570    C++ Non-user code. Symbols loaded.
combase.dll!ActivationPropertiesIn::DelegateCreateInstance(IUnknown * pUnkOuter=0x00000000, IActivationPropertiesOut * * ppActPropsOut=0x003ae52c) Line 1983    C++ Non-user code. Symbols loaded.
combase.dll!ICoCreateInstanceEx(const _GUID & OriginalClsid, IUnknown * punkOuter=0x00000000, unsigned long dwClsCtx=23, _COSERVERINFO * pServerInfo=0x00000000, unsigned long dwCount=1, unsigned long dwActvFlags=0, tagMULTI_QI * pResults=0x003ae91c, ActivationPropertiesIn * pActIn=0x003adcc0) Line 2032 C++ Non-user code. Symbols loaded.
combase.dll!CComActivator::DoCreateInstance(const _GUID & Clsid={...}, IUnknown * punkOuter=0x00000000, unsigned long dwClsCtx=23, _COSERVERINFO * pServerInfo=0x00000000, unsigned long dwCount=1, tagMULTI_QI * pResults=0x003ae91c, ActivationPropertiesIn * pActIn=0x00000000) Line 401 C++ Non-user code. Symbols loaded.
[Inline Frame] combase.dll!CoCreateInstanceEx(const _GUID &) Line 177   C++ Non-user code. Symbols loaded.
combase.dll!CoCreateInstance(const _GUID & rclsid={...}, IUnknown * pUnkOuter=0x00000000, unsigned long dwContext=23, const _GUID & riid={...}, void * * ppv=0x003afa1c) Line 121   C++ Non-user code. Symbols loaded.
Example.exe!CExampleDlg::OnInitDialog() Line 134    C++ Symbols loaded.
mfc140d.dll!AfxDlgProc(HWND__ * hWnd=0x0005047a, unsigned int message=272, unsigned int __formal=66690, long __formal=0) Line 28    C++ Non-user code. Symbols loaded.
user32.dll!__InternalCallWinProc@20()   Unknown Non-user code. Symbols loaded.
user32.dll!UserCallDlgProcCheckWow()    Unknown Non-user code. Symbols loaded.
user32.dll!DefDlgProcWorker()   Unknown Non-user code. Symbols loaded.
user32.dll!_DefDlgProcA@16()    Unknown Non-user code. Symbols loaded.
user32.dll!__InternalCallWinProc@20()   Unknown Non-user code. Symbols loaded.
user32.dll!UserCallWinProcCheckWow()    Unknown Non-user code. Symbols loaded.
user32.dll!CallWindowProcAorW(long ,struct HWND__ *,enum _WM_VALUE,unsigned int,long,int)   Unknown Non-user code. Symbols loaded.
user32.dll!_CallWindowProcA@20()    Unknown Non-user code. Symbols loaded.
mfc140d.dll!CWnd::DefWindowProcA(unsigned int nMsg=272, unsigned int wParam=66690, long lParam=0) Line 1100 C++ Non-user code. Symbols loaded.
mfc140d.dll!CWnd::Default() Line 297    C++ Non-user code. Symbols loaded.
mfc140d.dll!CDialog::HandleInitDialog(unsigned int __formal=66690, long __formal=0) Line 740    C++ Non-user code. Symbols loaded.
mfc140d.dll!CWnd::OnWndMsg(unsigned int message=272, unsigned int wParam=66690, long lParam=0, long * pResult=0x003af204) Line 2441 C++ Non-user code. Symbols loaded.
mfc140d.dll!CWnd::WindowProc(unsigned int message=272, unsigned int wParam=66690, long lParam=0) Line 2099  C++ Non-user code. Symbols loaded.
mfc140d.dll!AfxCallWndProc(CWnd * pWnd=0x003af8f4, HWND__ * hWnd=0x0005047a, unsigned int nMsg=272, unsigned int wParam=66690, long lParam=0) Line 265  C++ Non-user code. Symbols loaded.
mfc140d.dll!AfxWndProc(HWND__ * hWnd=0x0005047a, unsigned int nMsg=272, unsigned int wParam=66690, long lParam=0) Line 418  C++ Non-user code. Symbols loaded.
mfc140d.dll!AfxWndProcBase(HWND__ * hWnd=0x0005047a, unsigned int nMsg=272, unsigned int wParam=66690, long lParam=0) Line 299  C++ Non-user code. Symbols loaded.
user32.dll!__InternalCallWinProc@20()   Unknown Non-user code. Symbols loaded.
user32.dll!UserCallWinProcCheckWow()    Unknown Non-user code. Symbols loaded.
user32.dll!SendMessageWorker(struct tagWND *,unsigned int,unsigned int,long,int)    Unknown Non-user code. Symbols loaded.
user32.dll!InternalCreateDialog()   Unknown Non-user code. Symbols loaded.
user32.dll!_CreateDialogIndirectParamAorW@24()  Unknown Non-user code. Symbols loaded.
user32.dll!_CreateDialogIndirectParamA@20() Unknown Non-user code. Symbols loaded.
mfc140d.dll!IsolationAwareCreateDialogIndirectParamA(HINSTANCE__ * hInstance=0x007c0000, const DLGTEMPLATE * lpTemplate=0x0080ee70, HWND__ * hWndParent=0x00000000, int(__stdcall*)(HWND__ *, unsigned int, unsigned int, long) lpDialogFunc=0x5979ead0, long dwInitParam=0) Line 539   C++ Non-user code. Symbols loaded.
mfc140d.dll!CWnd::CreateDlgIndirect(const DLGTEMPLATE * lpDialogTemplate=0x0080ee70, CWnd * pParentWnd=0x00000000, HINSTANCE__ * hInst=0x007c0000) Line 373 C++ Non-user code. Symbols loaded.
mfc140d.dll!CWnd::CreateRunDlgIndirect(const DLGTEMPLATE * lpDialogTemplate=0x0080ee70, CWnd * pParentWnd=0x00000000, HINSTANCE__ * hInst=0x007c0000) Line 475  C++ Non-user code. Symbols loaded.
mfc140d.dll!CDialog::DoModal() Line 652 C++ Non-user code. Symbols loaded.
Example.exe!CExampleApp::InitInstance() Line 126    C++ Symbols loaded.
mfc140d.dll!AfxWinMain(HINSTANCE__ * hInstance=0x007c0000, HINSTANCE__ * hPrevInstance=0x00000000, char * lpCmdLine=0x00614740, int nCmdShow=10) Line 37    C++ Non-user code. Symbols loaded.
Example.exe!WinMain(HINSTANCE__ * hInstance=0x007c0000, HINSTANCE__ * hPrevInstance=0x00000000, char * lpCmdLine=0x00614740, int nCmdShow=10) Line 26   C++ Symbols loaded.
Example.exe!invoke_main() Line 107  C++ Non-user code. Symbols loaded.
Example.exe!__scrt_common_main_seh() Line 288   C++ Non-user code. Symbols loaded.
Example.exe!__scrt_common_main() Line 331   C++ Non-user code. Symbols loaded.
Example.exe!WinMainCRTStartup() Line 17 C++ Non-user code. Symbols loaded.
kernel32.dll!@BaseThreadInitThunk@12()  Unknown Non-user code. Symbols loaded.
ntdll.dll!__RtlUserThreadStart()    Unknown Non-user code. Symbols loaded.
ntdll.dll!__RtlUserThreadStart@8()  Unknown Non-user code. Symbols loaded.

@IInspectable: CLSIDFromProgID seems to work and returns S_OK

0

There are 0 best solutions below