社区
进程/线程/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中导出模板函数?
如何声明、定义该函数?
...全文
218
11
打赏
收藏
dll中不能导出模板函数?
template extern "C" _declspec(dllexport) BOOL DoFirst(T time); 编译无法通过,提示:error C2059: syntax error : 'string' 请问,该如何在dll中导出模板函数? 如何声明、定义该函数?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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中不能导出模板函数。
在编译时,编译器必须决定函数参数的内存结构大小,所以不可能生成模板函数。
CPP通用
dll
的
导出
模板
在实际开发
中
,"CPP通用
dll
的
导出
模板
"可能会包含一些示例代码,演示如何定义和
导出
函数
,以及如何在外部脚本
中
调用这些
函数
。开发者可能会提供一些基本的API
函数
,如初始化和释放
DLL
资源,以及其他核心功能
函数
。 ...
dll
动态链接库关键字
导出
函数
模板
`__declspec(
dll
export)`则表示这些
函数
是从
DLL
导出
的。 在使用
DLL
的应用程序
中
,我们需要使用`__declspec(
dll
import)`来导入
DLL
中
的
函数
。这样,编译器知道这些
函数
是在
DLL
中
定义的,而不是本地代码。例如,`main....
dll
动态链接库
模板
在本示例
中
,(.def)文件是定义
DLL
导出
函数
的关键。DEF文件是一种文本文件,用于指定
DLL
应该
导出
哪些
函数
或变量。例如,一个简单的.def文件可能包含如下内容: ```text LIBRARY
DLL
_NAME EXPORTS add @1 subtract ...
动态链接库
dll
导出
类的方法 VC
在这个“动态链接库
dll
导出
类的方法 VC”项目
中
,我们有两个关键的工程:
Dll
InstenceMfc用于生成
DLL
,而Test
Dll
则是调用这个
DLL
的应用程序。 首先,让我们深入了解一下VC++(Visual C++)环境
中
如何创建和使用
DLL
...
DLL
接口
导出
.rar
2. **编写
导出
函数
**:在
DLL
源码
中
,定义要
导出
的
函数
或过程,使用易语言的语法编写
函数
体,并使用`
导出
`关键字标识该
函数
需要
导出
。 3. **设置
导出
选项**:在易语言的工程属性
中
,设置
导出
选项,确认哪些
函数
需要...
进程/线程/DLL
15,473
社区成员
49,171
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章