社区
进程/线程/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中导出模板函数?
如何声明、定义该函数?
...全文
213
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
动态链接库关键字
导出
函数
模板
dll
动态链接库,关键字__declspec(
dll
export)
导出
函数
,四则运算,显式和隐式调用
dll
dll
动态链接库
模板
dll
动态库
模板
,使用(.def)
导出
四则运算
函数
,显示调用和隐式调用
dll
Windows进程常用
DLL
模块注入技术
课程结合多种Windows进程常用
DLL
注入技术。... 导入表注入,涉及PE相关知识点,增加区段,移动导入表,增加导入表、增加
导出
函数
,修复表项数据等。 内核驱动级
Dll
模块注入技术,内核驱动入门扩展。
Sharp
Dll
Proxy:从合法的
DLL
检索
导出
的
函数
,并生成用于
DLL
代理加载或侧载的代理
DLL
源代码
模板
Sharp
Dll
代理 从合法的
DLL
检索
导出
的
函数
,并为
DLL
代理加载或侧载生成代理
DLL
源代码/
模板
与redteaming.co.uk的博客文章一起创建-> 用法 利润 学分 Vivek Ramachandran将
foxer
函数
扩展库
什么是 foxer
dll
foxer
dll
是一个专用于Visual FoxPro的外部库文件 提供一百多个
导出
函数
用来增强FoxPro的功能 foxer
dll
采用FLL的C++
模板
为什么不叫 foxer fll 是因为我觉得 fll 文件的图标不好看 : foxer
dll
的设计根本不考虑 Windows 98 Visual FoxPro 6 如果在这二个平台上遇到问题 我不予理会 foxer
dll
设计的目标运行环境: Windows 2000 或更高版本 Visual FoxPro 8 或更高版本 开发环境: Visual C++ 6 Windows Server 2003 测试环境: Visual FoxPro 9 Windows Server 2003 Windows XP SP1 Professional Runtime Library: foxer
dll
需要msvcp60
dll
Microsoft C++ Runtime Library 的支持 反馈意见: 如果你有什么意见或发现BUG 请发mail到: tobenz@126 com 申明: foxer
dll
是免费软件 你可以用于任何地方 也可以任意复制传皤 我也不限制使用方式 如果由于foxer
dll
本身的bug引起的错误 请自行承担所有后果 说明: 由于本人精力有限 以致本文档
中
会出现一些错误 如果有发现 请Email告之 ">什么是 foxer
dll
foxer
dll
是一个专用于Visual FoxPro的外部库文件 提供一百多个
导出
函数
用来增强FoxPro的功能 foxer
dll
采用FLL的C++
模板
为什么不叫 foxer fll 是因为我觉得 fll 文件的图标不好看 : foxer
dll
的设计根本不考虑 Wind [更多]
进程/线程/DLL
15,472
社区成员
49,183
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章