调用.DLL出现“非法操作”(运行时)错误提示?是什么问提?请大师指点!

shijunsh 2001-12-31 10:27:45
调用.DLL出现“非法操作”(运行时)错误提示?是什么问提?请大师指点!源程序如下:

#if !defined(AFX_TEST22DDIALOG_H__FBA991A7_FBA4_11D5_8B4E_814E9B0B2013__INCLUDED_)
#define AFX_TEST22DDIALOG_H__FBA991A7_FBA4_11D5_8B4E_814E9B0B2013__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// Test22dDialog.h : header file
//

extern "C" _declspec(dllimport) void Ex22dEntry();
#define RYG_SETSTATE WM_USER+0
#define RYG_GETSTATE WM_USER+1

/////////////////////////////////////////////////////////////////////////////
// CTest22dDialog dialog

class CTest22dDialog : public CDialog
{
// Construction
public:
CTest22dDialog(CWnd* pParent = NULL); // standard constructor

// Dialog Data
//{{AFX_DATA(CTest22dDialog)
enum { IDD = IDD_TEST22DDIALOG };
// NOTE: the ClassWizard will add data members here
//}}AFX_DATA


// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CTest22dDialog)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL

// Implementation
protected:

// Generated message map functions
//{{AFX_MSG(CTest22dDialog)
// NOTE: the ClassWizard will add member functions here
//}}AFX_MSG
afx_msg void OnClickedRyg();
DECLARE_MESSAGE_MAP()
private:
enum{OFF,RED,YELLOW,GREEN}m_nState;
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_TEST22DDIALOG_H__FBA991A7_FBA4_11D5_8B4E_814E9B0B2013__INCLUDED_)


// Test22dDialog.cpp : implementation file
//

#include "stdafx.h"
#include "EX22B.h"
#include "Test22dDialog.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CTest22dDialog dialog


CTest22dDialog::CTest22dDialog(CWnd* pParent /*=NULL*/)
: CDialog(CTest22dDialog::IDD, pParent)
{
//{{AFX_DATA_INIT(CTest22dDialog)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_nState=OFF;
Ex22dEntry();//Makesure DLL gets loaded
}


void CTest22dDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTest22dDialog)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CTest22dDialog, CDialog)
//{{AFX_MSG_MAP(CTest22dDialog)
// NOTE: the ClassWizard will add message map macros here
//}}AFX_MSG_MAP
ON_CONTROL(0,IDC_RYG,OnClickedRyg)//Notification code is 0
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTest22dDialog message handlers

void CTest22dDialog::OnClickedRyg()
{
switch(m_nState){
case OFF:
m_nState=RED;
break;
case RED:
m_nState=YELLOW;
break;
case YELLOW:
m_nState=GREEN;
break;
case GREEN:
m_nState=OFF;
break;
}
GetDlgItem(IDC_RYG)->SendMessage(RYG_SETSTATE,m_nState);
return;
}


#if !defined(AFX_TESTEX22CDIALOG_H__9B7DA9CE_FD07_11D5_8B4E_F92D2BCCC512__INCLUDED_)
#define AFX_TESTEX22CDIALOG_H__9B7DA9CE_FD07_11D5_8B4E_F92D2BCCC512__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// TestEX22cDialog.h : header file
//
extern "C" _declspec(dllimport) double Ex22cSquareRoot(double d);
/////////////////////////////////////////////////////////////////////////////
// CTestEX22cDialog dialog

class CTestEX22cDialog : public CDialog
{
// Construction
public:
CTestEX22cDialog(CWnd* pParent = NULL); // standard constructor

// Dialog Data
//{{AFX_DATA(CTestEX22cDialog)
enum { IDD = IDD_EX22C };
double m_dInput;
double m_dOutput;
//}}AFX_DATA


// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CTestEX22cDialog)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL

// Implementation
protected:

// Generated message map functions
//{{AFX_MSG(CTestEX22cDialog)
afx_msg void OnComputesqurt();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_TESTEX22CDIALOG_H__9B7DA9CE_FD07_11D5_8B4E_F92D2BCCC512__INCLUDED_)


// TestEX22cDialog.cpp : implementation file
//

#include "stdafx.h"
#include "EX22B.h"
#include "TestEX22cDialog.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CTestEX22cDialog dialog


CTestEX22cDialog::CTestEX22cDialog(CWnd* pParent /*=NULL*/)
: CDialog(CTestEX22cDialog::IDD, pParent)
{
//{{AFX_DATA_INIT(CTestEX22cDialog)
m_dInput = 0.0;
m_dOutput = 0.0;
//}}AFX_DATA_INIT
}
...全文
88 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
shijunsh 2002-01-01
  • 打赏
  • 举报
回复
xbx(chinastar):新年好!程序还没调通,我想可能是.DLL(一个自定义交通灯控件)的问题,还想你读一下源程序,再指点一下,.DLL源程序如下:
#if !defined(AFX_RYGWND_H__FBA99188_FBA4_11D5_8B4E_814E9B0B2013__INCLUDED_)
#define AFX_RYGWND_H__FBA99188_FBA4_11D5_8B4E_814E9B0B2013__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// RygWnd.h : header file
//

/////////////////////////////////////////////////////////////////////////////
// CRygWnd window

#define RYG_SETSTATE WM_USER+0
#define RYG_GETSTATE WM_USER+1

LRESULT CALLBACK AFX_EXPORT
RygWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);

class CRygWnd : public CWnd
{
// Construction
public:
CRygWnd();
public:
static BOOL RegisterWndClass(HINSTANCE hInstance);

// Attributes
public:

// Operations
public:

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CRygWnd)
protected:
virtual void PostNcDestroy();
//}}AFX_VIRTUAL

// Implementation
public:
virtual ~CRygWnd();

// Generated message map functions
private:
void SetMapping(CDC* pDC);
void UpdateColor(CDC* pCD,int n);

protected:
//{{AFX_MSG(CRygWnd)
afx_msg void OnPaint();
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
//}}AFX_MSG
afx_msg LRESULT OnSetState(WPARAM wParam,LPARAM lParam);
afx_msg LRESULT OnGetState(WPARAM wParam,LPARAM lParam);
DECLARE_MESSAGE_MAP()

private:
int m_nState;
static CBrush s_bColor[];
static CRect s_rColor[] ;
static CRect s_rect;
static CPoint s_point;
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_RYGWND_H__FBA99188_FBA4_11D5_8B4E_814E9B0B2013__INCLUDED_)

// RygWnd.cpp : implementation file
//

#include "stdafx.h"
#include "EX22D.h"
#include "RygWnd.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

LRESULT CALLBACK AFX_EXPORT
RygWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());

CWnd* pWnd;

pWnd=CWnd::FromHandlePermanent(hWnd);
if(pWnd==NULL){
//Assume that client created a CRygWnd window
pWnd=new CRygWnd;
pWnd->Attach(hWnd);
}
ASSERT(pWnd->m_hWnd==hWnd);
ASSERT(pWnd==CWnd::FromHandlePermanent(hWnd));
LRESULT lResult=AfxCallWndProc(pWnd,hWnd,message,wParam,lParam);
return lResult;
}

/////////////////////////////////////////////////////////////////////////////
// CRygWnd

//static data member
CPoint CRygWnd::s_point(300,300);//rounded corners;
CRect CRygWnd::s_rect(-500,1000,500,-1000);//output rectangle 1000 by 2000
CRect CRygWnd::s_rColor[]={CRect(-250,800,250,300),
CRect(-250,250,250,-250),
CRect(-250,300,250,-800)};
CBrush CRygWnd::s_bColor[]={RGB(192,192,192),
RGB(0xFF,0x00,0x00),
RGB(0xFF,0xFF,0x00),
RGB(0x00,0xFF,0x00)};

//static member function
BOOL CRygWnd::RegisterWndClass(HINSTANCE hInstance)

{
WNDCLASS wc;

wc.lpszClassName="RYG";//matches class name in client
wc.hInstance=hInstance;
wc.lpfnWndProc=RygWndProc;
wc.hCursor=::LoadCursor(NULL,IDC_ARROW);
wc.hIcon=0;
wc.lpszMenuName=NULL;
wc.hbrBackground=(HBRUSH)::GetStockObject(LTGRAY_BRUSH);
wc.cbClsExtra=0;
wc.cbWndExtra=0;
return(::RegisterClass(&wc)!=0);
}


/////////////////////////////////////////////////////////////////////////////

CRygWnd::CRygWnd()
{
m_nState=0;
TRACE("CRygWnd constructor\n");
}

CRygWnd::~CRygWnd()
{
TRACE("CRygWnd destructor\n");
}


BEGIN_MESSAGE_MAP(CRygWnd, CWnd)
//{{AFX_MSG_MAP(CRygWnd)
ON_WM_PAINT()
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
ON_MESSAGE(RYG_SETSTATE,OnSetState)
ON_MESSAGE(RYG_GETSTATE,OnGetState)
END_MESSAGE_MAP()

void CRygWnd::SetMapping(CDC *pDC)
{
CRect clientRect;

GetClientRect(clientRect);
pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetWindowExt(1000,2000);//1000by2000
pDC->SetViewportExt(clientRect.right,-clientRect.bottom);
pDC->SetViewportOrg(clientRect.right/2,clientRect.bottom/2);
}

void CRygWnd::UpdateColor(CDC* pDC,int n)
{
if(m_nState==n+1){
pDC->SelectObject(&s_bColor[n+1]);
}
else{
pDC->SelectObject(&s_bColor[0]);
}
pDC->Ellipse(s_rColor[n]);
}

/////////////////////////////////////////////////////////////////////////////
// CRygWnd message handlers

LRESULT CRygWnd::OnSetState(WPARAM wParam,LPARAM lParam)
{
TRACE("CRygWnd::SetState,wParam=%d\n",wParam);
m_nState=(int)wParam;
Invalidate(FALSE);
return 0L;
}

LRESULT CRygWnd::OnGetState(WPARAM wParam,LPARAM lParam)
{
TRACE("CRygWnd::GetState\n");
return m_nState;
}

void CRygWnd::OnLButtonDown(UINT nFlag,CPoint point)
{
//Notification code is HIWORD of wParam,0 in this case
GetParent()->SendMessage(WM_COMMAND,GetDlgCtrlID(),(LONG)GetSafeHwnd());//0
}

void CRygWnd::OnPaint()
{
int i;

CPaintDC dc(this);//device contex for painting
SetMapping(&dc);
dc.SelectStockObject(DKGRAY_BRUSH);
dc.RoundRect(s_rect,s_point);
for(i=0;i<3;i++){
UpdateColor(&dc,i);
}
}

void CRygWnd::PostNcDestroy()
{
TRACE("CRygWnd::PostNcDestroy()\n");
delete this;//CRygWnd::PostNcDestroy does nothing
}


xbx 2001-12-31
  • 打赏
  • 举报
回复
我没有看完,可能是读写超过申请范围的内存。

70,035

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧