游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5440|回复: 17

net_sky在不在?帮人帮到底啊!

[复制链接]

62

主题

296

帖子

302

积分

中级会员

Rank: 3Rank: 3

积分
302
QQ
发表于 2004-1-24 18:54:00 | 显示全部楼层 |阅读模式
前些天我问你关于dll的问题,你贴了一堆纸片上来,不过很实用!总算让俺入门了,现在又有新的问题了!
我在dll里做了一个类,怎么EXPOT?直接EXPORT class好像不行!帮人帮到底啊!!!!!!!谢谢!! [em3] [em3] [em3] [em3] [em3] [em3]

30

主题

298

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
QQ
发表于 2004-1-25 18:50:00 | 显示全部楼层

Re: net_sky在不在?帮人帮到底啊!

在DLL中导出一个CLASS,在头文件里声明CLASS时在CLASS关键字前用
declspec(__dllexprot),最好再加上extern "C" 来防止编绎器对类及成员函数进行名称变换。

PS:最好将成员函数全声明为VIRTUAL(COM对象就是这么干的),这样就不必对每个成员都进行导出,并且也不必重新编绎调用DLL的程序。
如果不行就试试用一个DEF文件来导出符号。建议你导出一个函数来返回一个类的指针(要求函数成员为VIRTUAL),这样就不必导出CLASS了。
再提供一个函数来删除指针指向的CLASS,并在DLL退出时进行防止资源LEAK的两次安全删除。

30

主题

298

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
QQ
发表于 2004-1-25 18:54:00 | 显示全部楼层

Re: net_sky在不在?帮人帮到底啊!

补充一句:

像DX这样基于COM的东东,都不直接导出类的,最好是像DX一样,提供一个函数来返回一个类的指针,并且自己管理类的引用计数(切记,否则就会MEMORY LEAK)。 [em10]

0

主题

21

帖子

21

积分

注册会员

Rank: 2

积分
21
发表于 2004-1-25 20:22:00 | 显示全部楼层

Re: Re: net_sky在不在?帮人帮到底啊!

hmhm: Re: net_sky在不在?帮人帮到底啊!

在DLL中导出一个CLASS,在头文件里声明CLASS时在CLASS关键字前用
declspec(__dllexprot),最好再加上extern...


类中的标识符好像必须得 mangling 的吧。

30

主题

298

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
QQ
发表于 2004-1-25 20:45:00 | 显示全部楼层

Re: Re: Re: net_sky在不在?帮人帮到底啊!

dancer: Re: Re: net_sky在不在?帮人帮到底啊!



类中的标识符好像必须得 mangling 的吧。



确实。。。。。。。不好意思。。。。。
不过如果用虚函数成员的类,用指针返回就不用在意了。

呵呵。。 [em5]

62

主题

296

帖子

302

积分

中级会员

Rank: 3Rank: 3

积分
302
QQ
 楼主| 发表于 2004-1-25 20:56:00 | 显示全部楼层

Re:net_sky在不在?帮人帮到底啊!

谢谢hmhm!
还有一点不明白:
如果导出一个类的指针的话,那么怎么使用它呢?因为在调用程序中并没有对类的完整定义(声明是可以有的),链接程序会不会找不到函数定义?

30

主题

298

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
QQ
发表于 2004-1-25 21:07:00 | 显示全部楼层

Re: Re:net_sky在不在?帮人帮到底啊!

skice: Re:net_sky在不在?帮人帮到底啊!

谢谢hmhm!
还有一点不明白:
如果导出一个类的指针的话,那么怎么使用它呢?因为在调用程序中并没有对类的完整定义(声明是可以有的),链接程序会不会找不到函数定义?



不谢,大家公同进步。
当然你还需要一个类声明的头文件,声明这个类即可,可以参看"ddraw.h"里的类声明。
你只需:含入头文件,加入库即可。当然也可以动态加载它。


PS:还需设定PATH。。。。嘿嘿

[em10]

30

主题

298

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
QQ
发表于 2004-1-25 21:12:00 | 显示全部楼层

Re: net_sky在不在?帮人帮到底啊!

嘿嘿,不好意思,忘了说正题了。。。。(汗)


就像用普通的指向对象的指针就行了,要在DLL中输出函数来删除指针指向的对象,必须用对象指针的地址来删除之。(用一个二级指针)。
想在程序中用DELETE的话,就必须导出了类的解构函数。建构函数不能为VIRTUAL,所以无法在程序中直接NEW。如果你有需要的话,只能导出
类的建构函数。

明白了吧。。。。。。。。好累好累          [em10]

62

主题

296

帖子

302

积分

中级会员

Rank: 3Rank: 3

积分
302
QQ
 楼主| 发表于 2004-1-25 22:07:00 | 显示全部楼层

Re:net_sky在不在?帮人帮到底啊!

在dll中class前要加些什么东西?加extern "C" declspec(__dllexprot)编译器会说会忽略:
ignored on left of 'class FlameXE' when no variable is declared
什么都不加的话,在主程序链接时出现如下错误:
Main.obj : error LNK2001: unresolved external symbol "public: int __thiscall FlameXE::InitGraph(struct HWND__ *,int,int)" (?InitGraph@FlameXE@@QAEHPAUHWND__@@HH@Z)
每个成员函数都有一个错误,怎么办?
还有就是dancer说的mangling是什么?
谢谢!

30

主题

298

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
QQ
发表于 2004-1-26 16:51:00 | 显示全部楼层

Re: Re:net_sky在不在?帮人帮到底啊!

skice: Re:net_sky在不在?帮人帮到底啊!

在dll中class前要加些什么东西?加extern "C" declspec(__dllexprot)编译器会说会忽略:
ignore...



昨天说错了。不好意思。

把 __declspec(dllexport) 放在class之后,像这样:

class __declspec(dllexport) MyWinClass{
private:
HWND m_hwnd;
public:
~MyWinClass();
};

这样就可以把类导出了。

如果你是按我说的方法用返回的指针就必须把public的成员函数声明为virtual。这样就可以通过 vptr来访问成员函数。不需要把成员都一一的导出。

关于mangling,是指c++编绎器在编绎时对函数名称进行的变换,经过变换的函数名只对编绎器和链接器有意义,用C也无法访问。加上extern "c"之后,就能避免编绎器对函数进行mangling,C也就能调用了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-4-23 04:40

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表