首先,我为任何错误道歉,英语不是我的母语。
这是我的问题:我编写了一个DLL,它导出了一个派生自CSocket的类,除了隐式加载DLL的客户端必须按如下方式实例化对象外,一切正常。
// Inside client constructor (client class scope object pointer)
CMyClass *m_lpMyObj = new MyClass;
但如果对象实例化如下:
// Inside the client class header file (client class scope object)
CMyClass m_myObj;
当我运行客户端时,我收到错误:
Unhandled exception at 0x775015de in MyApp.exe: 0xC00000FD: Stack overflow.
如果在我编写的客户端方法中存在同样的问题:
// Inside a client method (local object)
CMyClass myobj;
唯一的区别是当我调用该方法时发生错误(当然)。
这里有一些关于班级的细节:
// _AFXEXT defined for DLL project
#ifdef __cplusplus
extern "C" {
#endif
class CMyClass : public CSocket
{
DECLARE_DYNCREATE(CModbusConnector)
public:
AFX_EXT_CLASS CMyClass(); // Only some methods are exported
AFX_EXT_CLASS virtual ~CMyClass();
....
};
#ifdef __cplusplus
}
#endif
DLL是CWinApp派生的对象(常规DLL),我将DLL编译为扩展DLL,结果相同。
提前致谢。
此致
尼尔
答案 0 :(得分:1)
我认为正在发生的事情是DECLARE_DYNCREATE
适用于在运行时计算大小的对象。
当你说:
CMyClass *m_lpMyObj = new MyClass;
实际上,它可以为实例分配所需的内存,但是当你说:时
CMyClass m_myObj;
它在编译时没有真正的大小,只有'stub'的大小,所以当它尝试使用它时,它的写入超出了分配空间的末尾。