gpt4 book ai didi

c++ - VC++创建Cdialog类断言错误

转载 作者:行者123 更新时间:2023-11-28 06:07:32 25 4
gpt4 key购买 nike

我是 Visual Studio 的完全菜鸟,这可能是一个愚蠢的错误。

我只是想实例化一个 Cdialog 类,我正在制作一个 dll,最终需要在 Window 中有一些 activeX 命令。

我尝试了多种实例化方法,但总是出现断言错误。

所以在我的 calldllclass.h 中我有:

#pragma once
__declspec(dllexport) long init();

在我扩展 Cdialog 的类中:

//{{AFX_INCLUDES()
//}}AFX_INCLUDES

class CMyclass: public CDialog{

#include "resource.h"

public:
CMyclass(CWnd* pParent = NULL)
: CDialog(100, pParent){
//{{AFX_DATA_INIT(CMyclass)
//}}AFX_DATA_INIT
}; // standard constructor
virtual ~CMyclass(){};
long calc();
// Dialog Data
//{{AFX_DATA(CMyclass)
//}}AFX_DATA

// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMyclass)
protected:
//}}AFX_VIRTUAL

protected:
// Generated message map functions
//{{AFX_MSG(CMyclass)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()

};
//{{AFX_INSERT_LOCATION}}

我创建了一个资源类:

#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// English (U.S.) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32

#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE MOVEABLE PURE
BEGIN
"resource.h\0"
END

2 TEXTINCLUDE MOVEABLE PURE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END

3 TEXTINCLUDE MOVEABLE PURE
BEGIN
"#define _AFX_NO_SPLITTER_RESOURCES\r\n"
"#define _AFX_NO_OLE_RESOURCES\r\n"
"#define _AFX_NO_TRACKER_RESOURCES\r\n"
"#define _AFX_NO_PROPERTY_RESOURCES\r\n"
"\r\n"
"#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n"
"#ifdef _WIN32\r\n"
"LANGUAGE 9, 1\r\n"
"#pragma code_page(1252)\r\n"
"#endif //_WIN32\r\n"
"#include ""res\\SimpleVC6SampleEvent.rc2"" // non-Microsoft Visual C++ edited resources\r\n"
"#include ""afxres.rc"" // Standard components\r\n"
"#endif\r\n"
"\0"
END

#endif // APSTUDIO_INVOKED




/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

IDD_ABOUTBOX DIALOG DISCARDABLE 0, 0, 0, 0
STYLE DS_MODALFRAME
FONT 8, "MS Sans Serif"
BEGIN
END




#endif // English (U.S.) resources
/////////////////////////////////////////////////////////////////////////////

最后在我的 cpp 中我有:

// SIMPLEDIALOGDLL.cpp : Defines the exported functions for the DLL application.
//
#pragma once
#include "stdafx.h"
#include "myclass.h"
#include "resource.h"
#include "dll2export.h"


BEGIN_MESSAGE_MAP(CMyclass, CDialog)
//{{AFX_MSG_MAP(CMyclass)
//}}AFX_MSG
END_MESSAGE_MAP()


long init(){

AfxEnableControlContainer();
CoInitializeEx(NULL,COINIT_MULTITHREADED);
AFX_MANAGE_STATE(AfxGetStaticModuleState());

CMyclass * obj = new CMyclass();

//obj->ShowWindow(SW_HIDE);
obj->ShowWindow(SW_SHOW);

long res = obj->calc();
return (long) obj;
}

long CMyclass::calc(){
return 1+1;
}

当 obj->ShowWindow(SW_SHOW);叫做我得到一个调试断言失败!winocc.cpp 329行

BOOL CWnd::ShowWindow(int nCmdShow)
{
ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL));

if (m_pCtrlSite == NULL)
return ::ShowWindow(m_hWnd, nCmdShow);
else
return m_pCtrlSite->ShowWindow(nCmdShow);
}

我在 showWindow 返回 1400 之后进行了一点更新

   DWORD dw = GetLastError();

添加答案建议我有这个初始化方法

AfxEnableControlContainer();
CoInitializeEx(NULL,COINIT_MULTITHREADED);
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

CMyclass *obj = new CMyclass();

if(obj->Create(100)){
obj->ShowWindow(SW_HIDE);
DWORD dw = GetLastError();
}else{
DWORD dw = GetLastError();
}

现在我在 obj->Create(100)); objcore.cpp 行:40

最佳答案

@ScottMcP-MVP 是对的,无模式对话框需要调用 Create method .

此外,根据 MSDN docs on the constructor ,

To construct a modeless dialog box, use the protected form of the CDialog constructor. The constructor is protected because you must derive your own dialog-box class to implement a modeless dialog box. Construction of a modeless dialog box is a two-step process. First call the constructor; then call the Create member function to create a resource-based dialog box...

所以像 CMyclass() : CDialog() {...} 这样声明你的类并使用下面的代码来显示它:

CMyclass * obj = new CMyclass();
if (obj->Create(100))
obj->ShowWindow(SW_SHOW);
else
{ << error >>
}

P.S.:不要忘记在程序结束时删除变量!

关于c++ - VC++创建Cdialog类断言错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32100513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com