社区
进程/线程/DLL
帖子详情
dll中不能导出模板函数?
heartwell
2003-09-24 11:35:40
template <typename T>
extern "C" _declspec(dllexport) BOOL DoFirst(T time);
编译无法通过,提示:error C2059: syntax error : 'string'
请问,该如何在dll中导出模板函数?
如何声明、定义该函数?
...全文
226
11
打赏
收藏
dll中不能导出模板函数?
template extern "C" _declspec(dllexport) BOOL DoFirst(T time); 编译无法通过,提示:error C2059: syntax error : 'string' 请问,该如何在dll中导出模板函数? 如何声明、定义该函数?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
heartwell
2003-09-26
打赏
举报
回复
关键问题就在dll中没有主调函数,编译器无法确定其最终类型,OK,结贴了,在失败中学习,谢谢各位了~
shiquan
2003-09-26
打赏
举报
回复
哈哈,我感觉好有意思。
我理解的模板的运作是这样的,也许不对:由于我们总为了适应各种参数类别而写大量的重复代码(int main(int x){};int main(float x){};...)。所以c++编译器说:"这么办吧!你先给我个记号,用它代替类型,等你写实现时把真正的类型用'<'和'>'括起来。到那时我再把真正的函数写出来,你用过多少种类型的函数,我就声称多少中的函数。这样就可以解决写一大堆一模多样的函数的问题了,这下大家满足了吧??”
...
没有,肯定没有。搂主就没满足。JJ(just a joke).
所以说我觉得就算能导出,一样用不了。
个人观点,如果不对,请指正。
ac1998
2003-09-26
打赏
举报
回复
楼上的,当然,否则DLL没办法处理函数的栈。
heartwell
2003-09-25
打赏
举报
回复
比如,我希望在一个工程中使用dll中的一个函数,需要满足任意类型的参数传递,可能在工程中第一次调用时传递的是一个int类型参数,第二次调用传递的是一个自定义结构体类型参数,当我使用显式链接dll获取函数名的时候,是不能确定其参数类型的?也就是说只能在dll中编辑多个重载版本?那么就是说,是无法在dll中导出模板函数的?
SolidEst
2003-09-25
打赏
举报
回复
为编译项目创建一个.def文件然后加入
EXPORTS
DoFirst
然后编译即可
但编译后dll内的函数名为DoFirst和extern "C"的效果一样
但此时DoFirst不是模板函数了,而是具有实际类型参数的函数
SolidEst
2003-09-25
打赏
举报
回复
创建一个.def文件然后加入
EXPORTS
DoFirst
JoeRen
2003-09-25
打赏
举报
回复
“通过函数名显式链接dll”?对于模板函数,你有这样的需求?这是令人惊奇的。
模板函数并不是只有一个版本。如果有多个模板函数的实例,你想通过函数名显式连接的是哪一个版本呢?如果你能搞清楚这个问题,就应该知道如何解决了。
heartwell
2003-09-25
打赏
举报
回复
那么就是说无法从dll中导出参数类型不定的函数了?
JoeRen
2003-09-25
打赏
举报
回复
我不太清楚你的“显式连接Dll”是什么,假定它是指动态连接GetProcAddress的话,那么你提供给GetProcAddress的只有一个孤零零的函数名称(特别是这个名称还是extern "C"的,根本不可能提供任何类型信息)。那你要怎样辨别要取的是哪一个重载函数呢?
extern"C"的函数能传递的信息非常有限。如果它是使用C调用约定的话,只能传递名称。如果使用Pascal调用约定(现在叫做标准调用约定)的话还可以传递参数个数。这样的话,DLL要使用extern"C"导出重载函数都有点困难,更不要说模板函数了。
heartwell
2003-09-24
打赏
举报
回复
但是如果去掉extern "C" 似乎就没有这个问题了,extern "C"只是用来防止编译器改变函数名字,如果去掉就能通过编译,那么似乎就不是dll不可以生成模板函数了。但是,如果去掉了extern "C",就无法通过函数名显式链接dll了,请问有什么方法?
SolidEst
2003-09-24
打赏
举报
回复
模板的实质是类型安全的宏。所以dll中不能导出模板函数。
在编译时,编译器必须决定函数参数的内存结构大小,所以不可能生成模板函数。
动态链接库
dll
导出
类的方法 VC
动态链接库
导出
类的demo,压缩文件夹
中
有两个工程,一个是生成
dll
的工程一个是调用
dll
的工程,把生成的
dll
放到test
dll
的debug文件夹下就可以调用了,工程是用VS2010编写的。
DLL
文件
函数
提取器
提取
DLL
文件里面所包含的
函数
,然后直然引用,找到
DLL
的入口,非常方便。
C++编写
dll
和使用
dll
(最简单的例子vs2010)
用vs2010和C++语言编写的很简单的
dll
实例,内含
dll
源码,和如何使用
dll
的项目工程源码
Sharp
Dll
Proxy:从合法的
DLL
检索
导出
的
函数
,并生成用于
DLL
代理加载或侧载的代理
DLL
源代码
模板
Sharp
Dll
代理 从合法的
DLL
检索
导出
的
函数
,并为
DLL
代理加载或侧载生成代理
DLL
源代码/
模板
与redteaming.co.uk的博客文章一起创建-> 用法 利润 学分 Vivek Ramachandran将
用Delphi生成
DLL
并封装窗体的示例源代码
用Delphi生成
DLL
并封装窗体的示例源代码! 值得下载看看!资源免费,大家分享!! 更多免费资源 http://ynsky.download.csdn.net/
进程/线程/DLL
15,467
社区成员
49,170
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章