首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

框架程序里调用dll中里类的函数遇到的有关问题

2013-07-25 
框架程序里调用dll中里类的函数遇到的问题首先我是要完成一个复制功能(之前已经发过帖子,当时遇到的问题是

框架程序里调用dll中里类的函数遇到的问题
首先我是要完成一个复制功能(之前已经发过帖子,当时遇到的问题是dll内导出函数),程序主干部分不是我写的我也不是很明白。然后写的实现功能的代码如下

void CGDIModeView::OnEditCopy()
{
// TODO: 在此添加命令处理程序代码
CGDIModeDoc* pDoc = GetDocument();
CDC* pDC=GetDC();
HDC hDC = CreateEnhMetaFile(pDC->m_hDC,NULL,NULL,NULL);
pDC =  CDC::FromHandle(hDC);
//
    OnDraw(pDC);
HENHMETAFILE hmeta = CloseEnhMetaFile(hDC);
if (OpenClipboard())
{
if (EmptyClipboard())
{    
SetClipboardData(CF_ENHMETAFILE,hmeta);
CloseClipboard();
}
}
DeleteEnhMetaFile(hmeta);

//On(this);
}







void CGDIModeView::OnDraw(CDC* pDC)
{
CGDIModeDoc* pDoc = GetDocument();

Graphics* pGraphics = new Graphics(pDC->m_hDC);
Color a(0, 255, 255, 255);

if(pDoc->GetIndexDataList() < 0)
{
Color color_bk(255, 255, 255, 255);
SolidBrush brush_bk(color_bk);
pGraphics->FillRectangle(&brush_bk, 0, 0, m_totalLog.cx, m_totalLog.cy);
}
else
{
SingleDataFactory* factory = pDoc->GetSelectSingleDataFactoryList();
if(this->must_drawed)
{
switch(pDoc->GetIndexGraphType())
{
case 0:
factory->GetSinFactoryCurvePart()->DrawGraph();///
pGraphics->DrawImage(factory->GetSinFactoryCurvePart()->GetBaseImage(), 0, 0);
break;
case 1:
factory->GetSinFactoryBarPart()->DrawGraph();
pGraphics->DrawImage(factory->GetSinFactoryBarPart()->GetBaseImage(), 0, 0);
break;
case 2:
factory->GetSinFactoryPiePart()->DrawGraph();
pGraphics->DrawImage(factory->GetSinFactoryPiePart()->GetBaseImage(), 0, 0);
break;
case 3:
factory->GetSinFactoryVectorPart()->DrawGraph();
pGraphics->DrawImage(factory->GetSinFactoryVectorPart()->GetBaseImage(), 0, 0);
break;
case 4:
factory->GetSinFactoryStreamPart()->DrawGraph();
pGraphics->DrawImage(factory->GetSinFactoryStreamPart()->GetBaseImage(), 0, 0);
break;
case 5:
factory->GetSinFactoryIsolinePart()->DrawGraph();
pGraphics->DrawImage(factory->GetSinFactoryIsolinePart()->GetBaseImage(), 0, 0);
break;
}

must_drawed = FALSE;
}
else
{
switch(pDoc->GetIndexGraphType())
{
case 0:


pGraphics->DrawImage(factory->GetSinFactoryCurvePart()->GetBaseImage(), 0, 0);
break;
case 1:
pGraphics->DrawImage(factory->GetSinFactoryBarPart()->GetBaseImage(), 0, 0);
break;
case 2: 
pGraphics->DrawImage(factory->GetSinFactoryPiePart()->GetBaseImage(), 0, 0);
break;
case 3:
pGraphics->DrawImage(factory->GetSinFactoryVectorPart()->GetBaseImage(), 0, 0);
break;
case 4:
factory->GetSinFactoryStreamPart()->DrawOneLinePart();
pGraphics->DrawImage(factory->GetSinFactoryStreamPart()->GetBaseImage(), 0, 0);
break;
case 5:
pGraphics->DrawImage(factory->GetSinFactoryIsolinePart()->GetBaseImage(), 0, 0);
break;
}
}
}

delete pGraphics;
}


OnDraw的函数测试能够完成绘图功能,然后我想的是重绘到剪贴板上,然后我这么直接把ondraw函数放在OnEditCopy中没问题吗?

然后还有doc类的操作,这个我看着和网上的教程一样,但是报错空指针一直在这部分,还有一个doc类太长我也先不贴了
CGDIModeDoc* CGDIModeView::GetDocument() const
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGDIModeDoc)));
return (CGDIModeDoc*)m_pDocument;
}


经过几天的学习我觉得应该是我在框架里调用这个函数的时候没有复制的原因···
以下是框架里调用函数的部分

void CSciplotApp::OnEditCopy()//复制功能
{
//// TODO: 在此添加命令处理程序代码         
typedef  void(WINAPI *PPROC)(CWinApp* dlg);//不清楚怎么去写这个指针,感觉用CwinApp是错的。
 HINSTANCE GDIMode_hInstance= LoadLibrary(L"GDIMode.dll");
 if(GDIMode_hInstance==NULL)AfxMessageBox(L"调用dll失败!");
 PPROC OnEditCopyA; 

OnEditCopyA=(PPROC)GetProcAddress(GDIMode_hInstance, "oneditcopy");
if(OnEditCopyA==NULL)AfxMessageBox(L"调用函数失败!");
else
OnEditCopyA(this);


}



然后是框架里声明消息响应的部分
BEGIN_MESSAGE_MAP(CSciplotApp, CWinApp)//这个Message_Map的范围对于我复制功能实现的位置是不是太大了。
    ON_COMMAND(ID_EDIT_COPY, &CSciplotApp::OnEditCopy)//对应的响应


最后是放我的输出函数的部分,和我之前的消息响应的函数一样搞不懂
extern "C" void __stdcall oneditcopy()//复制到剪贴板
{
         AFX_MANAGE_STATE(AfxGetStaticModuleState());//动态链接到mfc库
    ::AfxMessageBox(L"调用函数成功!");//调试中确认
CGDIModeView* ondraw=NULL;//这个类的指针究竟该怎么定义?用new CGDIModeView()报错对象在protect范围内,调到
                          //,调到public后还是各种报错
        ondraw->OnEditCopy();


}



我觉得是不是应该像之前看的教程里说的InitInstance( )的主要任务 
定义并初始化了一个单文档模板对象pDocTemplate,构造这个对象时用了四个参数
第一个参数是显示和管理程序的资源, IDR_MAINFRAME就是资源的ID
其它三个参数是文档类,主框架类和视类的信息,通过MFC宏RUN_TIME_CLASS取得
4.   程序通过这些信息进行工作,在通过这个单文档模板对象打开或NEW一个新文档时,分别生成一个文档类,主框架类和视类的对象,并用第一个参数指定的资源进行管理
········这个框架里的初始化函数也贴一下吧

BOOL CSciplotApp::InitInstance()
{
// 如果一个运行在 Windows XP 上的应用程序清单指定要
// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
//则需要 InitCommonControlsEx()。否则,将无法创建窗口。
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// 将它设置为包括所有要在应用程序中使用的
// 公共控件类。
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);

CWinApp::InitInstance();

// 初始化 OLE 库
if (!AfxOleInit())
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}
AfxEnableControlContainer();
// 标准初始化
// 如果未使用这些功能并希望减小
// 最终可执行文件的大小,则应移除下列
// 不需要的特定初始化例程
// 更改用于存储设置的注册表项
// TODO: 应适当修改该字符串,
// 例如修改为公司或组织名
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
LoadStdProfileSettings(4);  // 加载标准 INI 文件选项(包括 MRU)
// 注册应用程序的文档模板。文档模板
// 将用作文档、框架窗口和视图之间的连接

//1
HINSTANCE GDIMode_hInstance= LoadLibrary(L"GDIMode.dll");
if (GDIMode_hInstance != NULL)
{
this->CreateGDIModeDocTemplate = (DLLDOCTEMPLATE)GetProcAddress(GDIMode_hInstance, "CreateGDIModeMultiDocTemplate") ;
if(CreateGDIModeDocTemplate != NULL)
{
CDLLMultiDocTemplate* pDocTemplateGDIMode;
pDocTemplateGDIMode = CreateGDIModeDocTemplate();
if (pDocTemplateGDIMode)
AddDocTemplate(pDocTemplateGDIMode);
}
else
{
::AfxMessageBox(L"加载GDI绘图组件失败!");
}
}
else
{
::AfxMessageBox(L"加载GDI绘图组件失败!");
return FALSE;
}

//2
HINSTANCE VTKMode_hInstance= LoadLibrary(L"VTKMode.dll");
if (VTKMode_hInstance != NULL)
{
this->CreateVTKModeDocTemplate = (DLLDOCTEMPLATE)GetProcAddress(VTKMode_hInstance, "CreateVTKModeMultiDocTemplate") ;
if(CreateVTKModeDocTemplate != NULL)
{
CDLLMultiDocTemplate* pDocTemplateVTKMode;
pDocTemplateVTKMode = CreateVTKModeDocTemplate();
if (pDocTemplateVTKMode)
AddDocTemplate(pDocTemplateVTKMode);
}
else
{
::AfxMessageBox(L"加载VTK绘图组件失败!");
}
}
else
{
::AfxMessageBox(L"加载VTK绘图组件失败!");
return FALSE;


}

// 创建主 MDI 框架窗口
CMainFrame* pMainFrame = new CMainFrame;
if (!pMainFrame || !pMainFrame->LoadFrame(IDR_MAINFRAME))
{
delete pMainFrame;
return FALSE;
}
m_pMainWnd = pMainFrame;
// 仅当具有后缀时才调用 DragAcceptFiles
//  在 MDI 应用程序中,这应在设置 m_pMainWnd 之后立即发生
// 启用拖/放
m_pMainWnd->DragAcceptFiles();

// 启用“DDE 执行”
EnableShellOpen();
RegisterShellFileTypes(TRUE);

// 分析标准外壳命令、DDE、打开文件操作的命令行
CCommandLineInfo cmdInfo;
cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;
ParseCommandLine(cmdInfo);


// 调度在命令行中指定的命令。如果
// 用 /RegServer、/Register、/Unregserver 或 /Unregister 启动应用程序,则返回 FALSE。
if (!ProcessShellCommand(cmdInfo))
return FALSE;
// 主窗口已初始化,因此显示它并对其进行更新
pMainFrame->ShowWindow(SW_SHOWMAXIMIZED);
pMainFrame->UpdateWindow();

return TRUE;
}





框架程序里调用dll中里类的函数遇到的有关问题现在的我的疑惑就是,我在类里写了复制的功能,dll库里已经已经导出了引用这个类里面复制功能函数的消息响应函数,然后我现在导出的类得到的是空指针没有任何价值,我想要让我的这个复制功能能够正确得到目前绘图区域的信息,使得我的实现绘图功能的类得到正确的定义···然后复制功能得以实现···
框架程序里调用dll中里类的函数遇到的有关问题我知道我这里的表述有点混乱···然后新手号分数不多了··但是求各位大虾解答一下我的疑惑啊····这个空指针的问题困扰我好久了····
[解决办法]
这是小号···用来不沉···
#pragma once
#include "GDIModeDoc.h"
#include "ZoomView.h"

// CGDIModeView 视图

class CGDIModeView : public CZoomView
{
DECLARE_DYNCREATE(CGDIModeView)
public:
BOOL must_drawed;
BOOL bkgnd_erased;

protected:
CGDIModeView();           // 动态创建所使用的受保护的构造函数
virtual ~CGDIModeView();

public:
//void CGDIModeView();  
    virtual void OnEditCopy();
virtual void OnFileExport();
virtual void OnDraw(CDC* pDC);      // 重写以绘制该视图
CGDIModeDoc* GetDocument() const;

CSize GetLogic(){return m_totalLog;}

#ifdef _DEBUG
virtual void AssertValid() const;


#ifndef _WIN32_WCE
virtual void Dump(CDumpContext& dc) const;
#endif
#endif

protected:
DECLARE_MESSAGE_MAP()
public:
virtual void OnInitialUpdate();
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
};




这个是view的构造

热点排行