• 全部
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

C/C++问题?

lhh2394 2001-07-22 05:21:02
本人对C/C++了解不多,下面有四句请高手给予解释
(摘抄<<精通Visual c++5.0编程>>)

//////////////////////////////////////////////////////////////////////////////////
//LineGenMethod.h

#if !defined LINEGENMETHOD_H
#define LINEGENMETHOD_H

#include "windows.h"
#include "afxtempl.h"
#include "LineGenMethodDlg.h"

typedef BOOL (*pLinePoint)(int,float*,float*,int*,float*,float*);/////////////////////请解释

class CLineGenMethod
{
public:
char m_filename[256];
struct Gen
{
char DllFileName[256];
char Name[256];
HINSTANCE hInstance;
Gen()
{
hInstance=NULL;
}
};
typedef CTypedPtrList<CPtrList,Gen*>GenBaseList;
GenBaseList GenList;
CLineGenMethod(char *filename);
~CLineGenMethod();
pLinePoint FindFun(CString& name);/////////////////////请解释
UINT GetGenCount();
BOOL Load();
BOOL Save();
BOOL Add(char* dllfilename,char* name);
void DeleteAll();
void SetDlg(CWnd* pParent);
};
#endif

//////////////////////////////////////////////////////////////////////////////////
//LineGenMethod.cpp

#include "stdafx.h"
#include "Chart.h"
#include "LineGenMethod.h"

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

CLineGenMethod::CLineGenMethod(char* filename)
{
strcpy(m_filename,filename);
Load();
}

CLineGenMethod::~CLineGenMethod()
{
Save();
DeleteAll();
}

BOOL CLineGenMethod::Load()
{
CFile f;
CFileException e;
if(!f.Open(m_filename,CFile::modeRead,&e))
{
#ifdef _DEBUG
afxDump<<"File could not de opened"<<e.m_cause<<"\n";
#endif
return FALSE;
}
UINT Count;
f.Read(&Count,sizeof UINT);
for(UINT i=0;i<Count;i++)
{
Gen newGen;
f.Read(&newGen,sizeof Gen);
Add(newGen.DllFileName,newGen.Name);
}
f.Close();
return TRUE;
}

BOOL CLineGenMethod::Add(char* dllfilename,char* name)
{
Gen*pGen=new Gen;
strcpy(pGen->DllFileName,dllfilename);
strcpy(pGen->Name,name);
pGen->hInstance=NULL;
HINSTANCE hLine=::LoadLibrary(dllfilename);
if(hLine==NULL)
{
char str[256];
sprintf(str,"CAn not Load File%s!",dllfilename);
::MessageBox(NULL,str,NULL,MB_OK|MB_ICONEXCLAMATION);
delete pGen;
return FALSE;
}
else
{
pLinePoint f=(pLinePoint)::GetProcAddress(hLine,"LinePoint");/////////////////////请解释
if(f==NULL)
{
char str[256];
sprintf(str,"File%s is Error!",dllfilename);
::MessageBox(NULL,str,NULL,MB_OK|MB_ICONEXCLAMATION);
::FreeLibrary(hLine);
delete pGen;
return FALSE;
}
else
{
pGen->hInstance=hLine;
GenList.AddTail(pGen);
return TRUE;
}
}
}

BOOL CLineGenMethod::Save()
{
CFile f;
CFileException e;
if(!f.Open(m_filename,CFile::modeWrite|CFile::modeCreate,&e))
{
#ifdef _DEBUG
afxDump<<"File could not de opened"<<e.m_cause<<"\n";
#endif
return FALSE;
}
UINT Count=GenList.GetCount();
f.Write(&Count,sizeof UINT);
POSITION pos=GenList.GetHeadPosition();
while(pos)
{
Gen* pGen=GenList.GetNext(pos);
f.Write(pGen,sizeof Gen);
}
f.Close();
return TRUE;
}

void CLineGenMethod::DeleteAll()
{
while(!GenList.IsEmpty())
{
Gen* pGen=GenList.RemoveHead();
::FreeLibrary(pGen->hInstance);
delete pGen;
}
}

UINT CLineGenMethod::GetGenCount()
{
return GenList.GetCount();
}

pLinePoint CLineGenMethod::FindFun(CString& name)
{
POSITION pos=GenList.GetHeadPosition();
while(pos)
{
Gen * pGen=GenList.GetNext(pos);
if(name==pGen->Name)
return (pLinePoint)::GetProcAddress(pGen->hInstance,"LinePoint");/////////////////////请解释
}
return NULL;
}

void CLineGenMethod::SetDlg(CWnd* pParent)
{
CLineGenMethodDlg Dlg;
Dlg.SetInitData(this);
Dlg.DoModal();
}

...全文
35 点赞 收藏 2
写回复
2 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
azuo_lee 2001-07-22
错了错了,上面的例子都举错了,都成了针对typedef BOOL (*pLinePoint)(int,float,float,int,float,float)类型的了。不过你明白意思就行了。
回复
azuo_lee 2001-07-22
<<typedef BOOL (*pLinePoint)(int,float*,float*,int*,float*,float*);
定义一个类型pLinePoint,用于表示类似BOOL Func(int,float*,float*,int*,float*,float*)类型的函数指针。例如你可以这样用:
BOOL Func(int,float*,float*,int*,float*,float*);
pLinePoint pFunc = Func;
BOOL ret = pFunc(1, 0.2, 0.2, 1, 0.2, 0.2);
//相当于BOOL ret = Func(1, 0.2, 0.2, 1, 0.2, 0.2);

<<pLinePoint FindFun(CString& name);
定以一个函数,该函数返回一个pLinePoint类型的函数指针。例如:
pLinePoint pFunc = FindFunc("SomeFunction");
BOOL ret = pFunc(1, 0.2, 0.2, 1, 0.2, 0.2);

<<pLinePoint f=(pLinePoint)::GetProcAddress(hLine,"LinePoint");
利用GetProcAddress取到一个名为"LinePoint"的函数指针,并通知编译器该函数是pLinePoint类型的(通过强制类型转化),并将其赋给一个pLinePoint型的变量f,以后就可以进行类似下面的调用:
BOOL ret = f(1, 0.2, 0.2, 1, 0.2, 0.2);
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2001-07-22 05:21
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……