描述:
1.资料上说:DLL中可以使用主调进程中的全局变量,请问如何编写?
2.资料上说:DLL中可以导出类的定义. 问题:我在一个静态DLL中定义了一个类,也用dllexport 方式导出了,但我在主调进程中要使用这个类来定义一个对象,按照资料上讲的,需要用dllimport来导入该类的定义,这样做我试了确实也可以,但我想问的是我在主调工程中直接声明这个类(即去掉_declspec(dllimport)),但没有实现这个类,然后用这个类定义了对象,一样的可以(我原本想象中的也应该可以).请问它们有什么区别?
3.这个问题与第二个问题有点类似:DLL中用dllexport导出函数,然后在主调工程中用dllimport导入函数,确实可以. 但如果在主调工程中直接声明(即去掉_declspec(dllimport)),但没有实现这个函数,一样的可以, 请问两者有什么区别?
在这之前看过CSDN中有人问过这个问题,很多人回贴,但我感觉都说得不清,就再来问一次.
解决方案1:
1:通过传参的方式(当然传入的是引用,因为不知道在什么地方就会被修改),在dll中使用“主调进程”的全局变量(主调进程真是别扭,其实就是应用程序启动项目吧,权且就按你的来叫)
2:你声明的类肯定是在应用程序启动项目功能中的,所以他的适用范围也仅限与主程序模块,在其它的dll中是无法使用的
3:您说了这句话“在主调工程中直接声明这个类(即去掉_declspec(dllimport)),但没有实现这个类,然后用这个类定义了对象,一样的可以”,我深表质疑,如果没有实现,是不用通过编译的,更谈不上“可以”,除非你的编译器不是“寻常类”
4:"两者有什么区别"不知道你指的是什么,dll中的类是和dll中封装的功能息息相关,dll导出,可以在任何地方引入dll进行使用,这就是区别吧
解决方案2:
1、不可能吧?
2、3、在VS2008的MSDN里看到过,好像是说:调用者使用dllimport声明,可以生成更有效的代码。我想是不是诸如函数寻址等方面。
dll的使用方不需要dllimport,那是因为编译器智能。它会在所有obj和lib里面去找实现(如果cpp里面没有实现的话),但申明还是需要的,至于申明前加不加dllimport,无所谓,但不保证标准。
解决方案4: 1. 不知道,个人理解不能直接用。
2,3 是一个问题,有lib文件的情况下其实不需要dllimport. 你看Windows Api的声明都没有 dllimport.
只不过规范推荐dllexport的函数用dllimport来引用声明。
MSDN说 dllimport声明的变量会有额外的代码生成,具体嘛样不太清楚。
你看看延迟加载的dll有木有不一样的
1.DLL使用主进程的全局变量:
#pragma data_seg(".SHARE")
int m_IntValue;
#pragma data_seg()
#pragma comment(linker, "/section:.SHARE,rws")
2. 3.
可能没完全看懂你的问题。 在DLL中实现一个类导出要在类名前定义dllexport,这样EXE或其他调用者
才可以调用,调用时定义dllimport。如果是采用静态调用DLL中的类这是必须的。
你说在主工程中直接声明,不理解是不是重新定义了一个类?如果是那当然是可以,跟DLL里面的是两个类
了,你没有dllimport,优先用你主进程的类。类没有定义实现,那.H里就有实现了(只不过是空的)
编译器是根据.H文件找.OBJ链接,如果找到就链接,没有找到就会报错。