用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共享数据也不是通过这种方式来的。
------解决方案--------------------
引用:
Quote: 引用:

1)对,就我所知只能如此
2)错,你对dll的理解是错误的,要想共享dll中的数据,必须在dll中使用共享数据段


可能我没有把问题说清楚,不好意思。我说的"共享"不是共享数据段的意思,而是说,两个exe同时使用一个dll,这个dll操作系统只需要加载一份,然后exe在load的时候各自把dll映射到自己的地址空间。

所以我的问题其实是: 如果dll导出类型是必须在编译连接的时候就确定了的,那么就相当于是静态决定了dll中函数的地址了。那么A和B同时运行的时候,是不是分别加载了一个dll的实例,而不是两个应用程序共享一个dll的实例呢?

希望我这次说清楚了问题。还望高手继续指导哈!

同样的dll只会加载一份.
系统会重定位,dll里面不是固定的函数地址。

------解决方案--------------------
引用:
例如,在一个dll里面我用dllexport导出一个类及其所有的函数。那么在使用这个类的可执行程序的vc工程当中,是不是必须得静态链接dll的lib文件,才能成功的使用这个导出类?(问题一)

   这样的话,就会产生一个问题: 
   如果有两个不同的exe例如A和B,都要使用这个导出类的话,静态链接会使得链接地址是绑定的,而不是动态加载的时候决定的。当A和B同时都启动的时候,可否说,它们会各自加载一份dll的拷贝到自己的进程映象里面,而不是共享一个dll的映象。这样的话dll就不是共享库了,对吗? (问题二)

还请高手解答,谢谢!




引用:
Quote: 引用:

Quote: 引用:

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;不存在。