Здраствуйте.
Пишу с таким вопросом:
Запускаю окно диалога через функцию из dll. Окно отображается и тут же windows пишет что обнаружена ошибка. Почему? и что делать?
Код экспортируемой функции:
#include "test.h"
#include "Dlg.h"
extern "C" __declspec(dllexport) int TestFunc()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CDlg dlg;
AfxMessageBox("Этот вызов работает", MB_OK);
dlg.DoModal();
return TRUE;
}
код Dlg.h
#if !defined(AFX_DLG_H__B90B4971_C399_4AEE_8C62_86A63FCC9C0D__INCLUDED_)
#define AFX_DLG_H__B90B4971_C399_4AEE_8C62_86A63FCC9C0D__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// Dlg.h : header file
//
#include "resource.h"
#include "afxwin.h"
/////////////////////////////////////////////////////////////////////////////
// CDlg dialog
class CDlg : public CDialog
{
// Construction
public:
CDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CDlg)
enum { IDD = IDD_DLG };
// NOTE: the ClassWizard will add data members here
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CDlg)
virtual void OnOK();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_DLG_H__B90B4971_C399_4AEE_8C62_86A63FCC9C0D__INCLUDED_)
Код Dlg.cpp
#include "Dlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDlg dialog
CDlg::CDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDlg, CDialog)
//{{AFX_MSG_MAP(CDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDlg message handlers
void CDlg::OnOK()
{
// TODO: Add extra validation here
AfxMessageBox("Работает");
CDialog::OnOK();
}
код вызывающей программы:
#include "stdafx.h"
typedef void (WINAPI*cfunc)();
cfunc TestFunc;
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HINSTANCE hLib=LoadLibrary("MyDll.dll");
TestFunc=(cfunc)GetProcAddress((HMODULE)hLib, "TestFunc");
TestFunc();
FreeLibrary((HMODULE)hLib);
return 0;
}