用declspec(_dllexport)导出一个class,这种class务必被使用者静态链接吗
用declspec(__dllexport)导出一个class,这种class必须被使用者静态链接吗?
例如,在一个dll里面我用dllexport导出一个类及其所有的函数。那么在使用这个类的可执行程序的vc工程当中,是不是必须得静态链接dll的lib文件,才能成功的使用这个导出类?(问题一)
这样的话,就会产生一个问题:
如果有两个不同的exe例如A和B,都要使用这个导出类的话,静态链接会使得链接地址是绑定的,而不是动态加载的时候决定的。当A和B同时都启动的时候,可否说,它们会各自加载一份dll的拷贝到自己的进程映象里面,而不是共享一个dll的映象。这样的话dll就不是共享库了,对吗? (问题二)
还请高手解答,谢谢!
------解决方案--------------------
1)对,就我所知只能如此
2)错,你对dll的理解是错误的,要想共享dll中的数据,必须在dll中使用共享数据段
------解决方案--------------------
问题一: 不是 所以不存在问题二...
------解决方案--------------------
1.可以动态加载,但是导出类不能通过getprocaddress来,不过可以通过导出函数来返回类指针达到相同的目的。
2.这个不是同一个问题,A和B共享数据也不是通过这种方式来的。
------解决方案--------------------
同样的dll只会加载一份.
系统会重定位,dll里面不是固定的函数地址。
------解决方案--------------------
问题1 ,可以伪句柄的的方式c接口函数导出 ,供大多语言使用
对其他语言不清楚,所以答案没有验证过。仅供参考。
听说C#调用c++的类, C#肯定无法识别c++头文件的,所以C#其加载dll的方式无法理解。
问题2;不存在。
例如,在一个dll里面我用dllexport导出一个类及其所有的函数。那么在使用这个类的可执行程序的vc工程当中,是不是必须得静态链接dll的lib文件,才能成功的使用这个导出类?(问题一)
这样的话,就会产生一个问题:
如果有两个不同的exe例如A和B,都要使用这个导出类的话,静态链接会使得链接地址是绑定的,而不是动态加载的时候决定的。当A和B同时都启动的时候,可否说,它们会各自加载一份dll的拷贝到自己的进程映象里面,而不是共享一个dll的映象。这样的话dll就不是共享库了,对吗? (问题二)
还请高手解答,谢谢!
------解决方案--------------------
1)对,就我所知只能如此
2)错,你对dll的理解是错误的,要想共享dll中的数据,必须在dll中使用共享数据段
------解决方案--------------------
问题一: 不是 所以不存在问题二...
------解决方案--------------------
1.可以动态加载,但是导出类不能通过getprocaddress来,不过可以通过导出函数来返回类指针达到相同的目的。
2.这个不是同一个问题,A和B共享数据也不是通过这种方式来的。
------解决方案--------------------
同样的dll只会加载一份.
系统会重定位,dll里面不是固定的函数地址。
------解决方案--------------------
例如,在一个dll里面我用dllexport导出一个类及其所有的函数。那么在使用这个类的可执行程序的vc工程当中,是不是必须得静态链接dll的lib文件,才能成功的使用这个导出类?(问题一)
这样的话,就会产生一个问题:
如果有两个不同的exe例如A和B,都要使用这个导出类的话,静态链接会使得链接地址是绑定的,而不是动态加载的时候决定的。当A和B同时都启动的时候,可否说,它们会各自加载一份dll的拷贝到自己的进程映象里面,而不是共享一个dll的映象。这样的话dll就不是共享库了,对吗? (问题二)
还请高手解答,谢谢!
1)对,就我所知只能如此
2)错,你对dll的理解是错误的,要想共享dll中的数据,必须在dll中使用共享数据段
可能我没有把问题说清楚,不好意思。我说的"共享"不是共享数据段的意思,而是说,两个exe同时使用一个dll,这个dll操作系统只需要加载一份,然后exe在load的时候各自把dll映射到自己的地址空间。
所以我的问题其实是: 如果dll导出类型是必须在编译连接的时候就确定了的,那么就相当于是静态决定了dll中函数的地址了。那么A和B同时运行的时候,是不是分别加载了一个dll的实例,而不是两个应用程序共享一个dll的实例呢?
希望我这次说清楚了问题。还望高手继续指导哈!
同样的dll只会加载一份.
系统会重定位,dll里面不是固定的函数地址。
问题一: 不是 所以不存在问题二...
问题1 ,可以伪句柄的的方式c接口函数导出 ,供大多语言使用
对其他语言不清楚,所以答案没有验证过。仅供参考。
听说C#调用c++的类, C#肯定无法识别c++头文件的,所以C#其加载dll的方式无法理解。
问题2;不存在。