我是个VC初学者,遇到关于DLL和添加引用的问题,请高手指教! 情况可能有点复杂,请耐心看完,不胜感激

我是个VC初学者,遇到关于DLL和添加引用的问题,请高手指教! 情况可能有点复杂,请耐心看完,不胜感激,第1张

楼主理解是正确的。楼主说自己试初学VC,但居然能够自己研究发现这么多信息,如果我是初学者的话,我肯定没楼主那么能干。一定会一头雾水。从这点上,我非常佩服楼主的才能!我是远远达不到这样的高度的。

至于他们给你的DLL,基本上能断定那个是CLR写的DLL。就我理解,CLR应该和MFC是完全不一样的,无论是语言的语法,或者是从CLR、MFC的基础架构方面,都没有交集!因此可以将CLR理解为一门全新的语言,它使用的库是.net 库。楼主肯定有 MFC 基础的。如果楼主研究过C#的话,那CLR应该是很容易上手的。从亲缘性方面来讲,CLR项目和C#项目更相似。它们的DLL只需要在使用DLL的项目中,通过楼主所言的“引用”方式添加进来就OK了。没有LIB的区别。它的实现机制是:所有DLL/EXE在文件内部都会有一个清单,该清单记录了DLL/EXE自己实现的类,函数以及它引用别人的类、函数和这些文件名等一系列信息。

至于有人提出是COM的关系,我认为这个问题应该和COM没有一点关系。所以如果要从COM入手,完全是一条死胡同。会浪费时间的!

虽然VC支持MFC和CLR混编,但如果要混编,我感觉系统不稳定,一方面我担心兼容性的问题导致程序的稳定性问题。另一方面,既要熟悉MFC,又要熟悉CLR,否则混编很困难。我认为,既然要用别人的CLR DLL,那么最好还是别用MFC,直接做CLR。楼主不熟悉CLR,那么只有学。尽管需要赶工期,但我也想不出好办法。做CLR项目是我认为最好的出路!

用MFC制作的工程由很多文件构成,它不能象一般C++程序那样随意在类外定义全局变量,在这里要想定义能被工程内多个文件共享的全局变量和函数必须用一些特殊方法才行。实际上有多种方法可以实现,这里只介绍两种方法。

一、在应用程序类中定义

用MFC生成的工程中都有一个名为CxxxApp的类,它派生于CWinApp类。这个类主要进行程序的初始化,生成文档、视图对象等工作。我们可以把需要全局访问的变量和函数定义为这个类的成员变量和成员函数,就可以实现全局访问了。

从严格意义上讲,这种变量和函数并不是全局的,因为它仍然只是类中的成员,只是由于我们很容易获得CxxxApp类的指针,所以我们可以在文档、视图、对话框以及各种自定义类中访问到它们,达到与全局变量类似的效果。访问时用函数“AfxGetApp()”获得CxxxApp类的指针,用“AfxGetApp()->成员”访问变量或函数。

例:

Test.h:(应用程序类头文件)

class CTestApp : public CWinApp

{

  public:

int x//全局变量

int f(int y)//全局函数

…………

}

Test.cpp:(应用程序类程序文件)

int CTestApp::f(int y) //全局函数定义

{

  y++

  return y

}

定义在CTestApp类中的变量和函数可以在其它类中被访问。比如在视图的某函数中要访问变量x和函数f():

void CTestView::xyz()

{

  CTestApp *app = (CTestApp *)AfxGetApp()//生成指向应用程序类的指针

  app->x = 0//访问变量x

  int z = app->f(1)//访问函数f()

  …………

}

这样,变量x和函数f()可以视作为全局的。

用这种方法实现的全局变量和全局函数虽比较简单,但也有缺点,一是访问不太方便,每次都需要获取应用程序类的指针;再就是把一些与应用程序类本身无关的变量和函数放在里面,使这个类看上去怪怪的,破坏了类的封装。

二、用静态变量和静态函数实现

很喜欢API函数的那种调用方法,不论在哪个类中只要用“::API函数”就可以调用了。合理利用静态类型(static)可以实现与此相似的全局变量和全局函数。

静态变量和静态函数有如下性质:

若在一个类中用关键字static声明数据成员,则这个数据成员就只存在一个拷贝,无论该类创建了多少个实例,它始终只存在一个,即使该类的实例一个也没创建,它也存在。

若在一个类中用关键字static声明函数,该函数可以用“类名::函数名”方式访问,无需引用该类的实例,甚至这个类的实例可以不存在。

利用这个性质实现的全局变量和函数使用起来很方便。

值得注意的是,全局变量和全局函数最好集中封装,不要在文档、视图等类内部定义,这样用起来才有全局的感觉。

例:

1、添加一个没有基类的新类,设类名起为CPublic,姑且称之为公用类

单击“Insert”菜单下的“New Class”命令,选择“Class type”为“Generic Class”,在“Name”栏中填入类名“CPublic”,单击“OK”,则新类建立完毕。

2、包含公用类的头文件,使各个类都能访问它

CPublic的头文件应包含在应用程序类的头文件中,这样在其它类中引用CPublic类时就不需要再包含了。

Test.h:(应用程序类头文件)

#include "Public.h" //包含公用类头文件

class CTestApp : public CWinApp

{

…………

}

3、在公用类中定义全局变量和全局函数,均使用static修饰,静态变量还必须在类外定义和初始化

Public.h:(公用类头文件)

class CPublic

{

public:

CPublic()

virtual ~CPublic()

public:

static int x//全局变量

static int time//全局变量

static int f(int y)//全局函数

…………

}

在公用类中对静态变量进行初始化和定义函数体:

Public.cpp:(公用类程序文件)

int CPublic::x = 0//初始化全局变量

int CPublic::time//定义全局变量

CPublic::CPublic()

{

}

CPublic::~CPublic()

{

}

int CPublic::f(int y) //全局函数,这里不要再加static

{

y++

return y

}

4、全局量的使用

使用变量:CPublic::变量名

使用函数:CPublic::函数()

如在视图的某函数中访问变量x和函数f():

void CTestView::xyz()

{

CPublic::x = 0//访问变量x

CPublic::time = CPublic::f(1)//访问函数f()

…………

}

在其它类中访问x、time和f()的方法与此相同。

5、几点注意:

① 由于静态量可独立于类存在,不需要生成CPublic类的实例。

② 静态数据成员的定义和初始化必须在类外进行,如例中x的初始化;变量time虽然没有初始化,但也必须在类外进行定义。由于没有生成CPublic类的实例,所以它的构造函数和析构函数都不会被执行,在里面做什么工作都没有什么意义。

③ 如果静态函数需要访问CPublic类内的变量,这些变量也必须为静态的。因为非静态量在不生成实例时都不会存在。 如:

class CPublic

{

public:

int x//内部变量

static int f(int y) //全局函数

{

x++

return x

}

…………

}

这里x虽为类内成员,但如果不生成CPublic类的实例,就会出现函数f()存在,而变量x不存在的问题。

总之,用没有实例的类管理全局量是一个不错的选择,它具有集中管理,使用方便的好处。当然,除非特别必要,全局量还是少用为好,一个好的编程者决不会随意滥用全局量的,一个封装做得不好的程序,在修改维护时会让你吃足苦头。

你不需要为combox添加索引项,只要你为combox对象添加了下来列表项(可以用代码,也可以在控件上点右键->属性,在数据选项卡中添加数据),则控件对象会为每一个列表项指定一个索引值,即从第一个列表项开始,依次为0,1,2,....。

补充:

可以添加多个数据,输入一条数据后按Ctrl+Enter回车后输第二条,不可能会出现输入多条后只剩一个数据的情况。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11876085.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存