社区
进程/线程/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中导出模板函数?
如何声明、定义该函数?
...全文
221
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中不能导出模板函数。
在编译时,编译器必须决定函数参数的内存结构大小,所以不可能生成模板函数。
动态链接库
dll
导出
类的方法 VC
在这个“动态链接库
dll
导出
类的方法 VC”项目
中
,我们有两个关键的工程:
Dll
InstenceMfc用于生成
DLL
,而Test
Dll
则是调用这个
DLL
的应用程序。 首先,让我们深入了解一下VC++(Visual C++)环境
中
如何创建和使用
DLL
...
DLL
接口
导出
.rar
2. **编写
导出
函数
**:在
DLL
源码
中
,定义要
导出
的
函数
或过程,使用易语言的语法编写
函数
体,并使用`
导出
`关键字标识该
函数
需要
导出
。 3. **设置
导出
选项**:在易语言的工程属性
中
,设置
导出
选项,确认哪些
函数
需要...
DLL
文件
函数
提取器
DLL
文件
函数
提取器是一个工具,专门用于查看和提取
DLL
文件
中
的
函数
,使得开发者无需了解
DLL
内部实现细节,就能直接调用所需的
函数
。
DLL
文件的主要作用在于代码复用和节省系统资源。通过将常用功能封装到
DLL
中
,多...
C语言生成
DLL
模板
1. **定义
导出
函数
**:在
DLL
中
,需要对外公开的
函数
需要被声明为
导出
函数
。在C语言
中
,这通常通过`__declspec(
dll
export)`关键字实现。例如: ```c #ifdef BUILD_
DLL
#define
DLL
_API __declspec(
dll
export) #...
VC++生成
DLL
与静态加载
DLL
代码
5. **运行并测试**:编译并运行控制台应用程序,如果一切正常,应该能看到
DLL
中
的
函数
被正确调用。 总结来说,VC++生成
DLL
涉及到创建项目、定义
导出
函数
、实现这些
函数
并进行编译。在控制台应用程序
中
静态加载
DLL
,...
进程/线程/DLL
15,467
社区成员
49,171
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章