请问在DLL中怎么导出结构,结构中有方法和变量

xharry 2005-05-30 11:57:48
我要在工程中解析xml,就从网上找了个代码段
http://www.codeproject.com/cpp/xmlite.asp

是个韩国人作的,我想把它放到DLL中,方便自己使用,可是他用的是struct
完全把struct当类来使用了,请问在DLL中怎么才能导出??

我本想把它改写成class的,赫赫,看看代码,好多地方都要改,赫赫,就想偷个
懒,到这里问问,能不能要好得解决方法:)

dll中导出class,变量,函数,都好办。导出结构体我还没看见过:(
...全文
532 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
senses1 2005-05-31
  • 打赏
  • 举报
回复
_declspec(dllexport) structname
qrlvls 2005-05-31
  • 打赏
  • 举报
回复
我忽略了结构体函数的问题,抱歉
应该和类的导出是一样的
yanedanny 2005-05-31
  • 打赏
  • 举报
回复
结构定义体也需要extern "C" _declspec(dllexport)修饰。
wangk 2005-05-31
  • 打赏
  • 举报
回复
试一试用COM包装
xharry 2005-05-31
  • 打赏
  • 举报
回复
:(
xharry 2005-05-31
  • 打赏
  • 举报
回复
谢谢大家了,再问最后一次,像如下的结构体具体怎么导啊:(
typedef struct _tagXMLNode
{
// name and value
CString name;
CString value;
// 中间我省率了一下方法和变量
// internal variables
LPXNode parent; // parent node
XNodes childs; // child node

_tagXMLNode() { parent = NULL; doc = NULL; type = XNODE_ELEMENT; }
~_tagXMLNode();

}XNode, *LPXNode;

加了typedef 看起来很乱,extern "C" _declspec(dllimport) typedef struct _tagXMLNode
{}
好像也不行;(

如果大家搞过的话,贴出来看看,就几句话而已,谢谢了

我在第一帖,也贴了该struct的url,如果您不嫌麻烦的话,可以尝试一下,能不能成功。
xharry 2005-05-30
  • 打赏
  • 举报
回复
to qrlvls(空 气)
那就是说,上面我提到的那个struct我不能放到DLL中了?
qrlvls 2005-05-30
  • 打赏
  • 举报
回复
结构不是导出的,结构的定义是在.h中来完成的,在编译后是不会生成符号链接的,因此结构的定义只能基于源码级的重用
而结构的实体就是变量
zeroweb 2005-05-30
  • 打赏
  • 举报
回复
struct和class应该是一样的,不过就是struct中成员的默认属性是public,class中的成员默认属性是private.
oyljerry 2005-05-30
  • 打赏
  • 举报
回复
导出结构体还没见过
mark
hainanb 2005-05-30
  • 打赏
  • 举报
回复
gz
xharry 2005-05-30
  • 打赏
  • 举报
回复
g:\mydesktop\新建文件夹\xmlparser\xmlite.h(133) : warning C4091: '__declspec(dllexport ) ' : ignored on left of 'struct _tagXMLNode' when no variable is declared

上面的warning是DLL工程中的

在使用DLL的程序中,报如下的错误

XMLDemoDlg.obj : error LNK2001: unresolved external symbol "public: __thiscall _tagXMLNode::~_tagXMLNode(void)" (??1_tagXMLNode@@QAE@XZ)
Debug/XMLDemo.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
xharry 2005-05-30
  • 打赏
  • 举报
回复
我是这么做的:


typedef struct _tagXMLNode
{
// name and value
CString name;
CString value;

// internal variables
LPXNode parent; // parent node
XNodes childs; // child node
XAttrs attrs; // attributes
NODE_TYPE type; // node type
LPXDoc doc; // document

// Load/Save XML
LPTSTR Load( LPCTSTR pszXml, LPPARSEINFO pi = &piDefault );
CString GetXML( LPDISP_OPT opt = &optDefault );
CString GetText( LPDISP_OPT opt = &optDefault );

// internal load functions
LPTSTR LoadAttributes( LPCTSTR pszAttrs, LPPARSEINFO pi = &piDefault );
LPTSTR LoadAttributes( LPCTSTR pszAttrs, LPCTSTR pszEnd, LPPARSEINFO pi = &piDefault );
LPTSTR LoadProcessingInstrunction( LPCTSTR pszXml, LPPARSEINFO pi = &piDefault );
LPTSTR LoadComment( LPCTSTR pszXml, LPPARSEINFO pi = &piDefault );
LPTSTR LoadCDATA( LPCTSTR pszXml, LPPARSEINFO pi = &piDefault );

// in own attribute list
LPXAttr GetAttr( LPCTSTR attrname );
LPCTSTR GetAttrValue( LPCTSTR attrname );
XAttrs GetAttrs( LPCTSTR name );

// in one level child nodes
LPXNode GetChild( LPCTSTR name );
LPCTSTR GetChildValue( LPCTSTR name );
CString GetChildText( LPCTSTR name, LPDISP_OPT opt = &optDefault );
XNodes GetChilds( LPCTSTR name );
XNodes GetChilds();

LPXAttr GetChildAttr( LPCTSTR name, LPCTSTR attrname );
LPCTSTR GetChildAttrValue( LPCTSTR name, LPCTSTR attrname );

// search node
LPXNode Find( LPCTSTR name );

// modify DOM
int GetChildCount();
LPXNode GetChild( int i );
XNodes::iterator GetChildIterator( LPXNode node );
LPXNode CreateNode( LPCTSTR name = NULL, LPCTSTR value = NULL );
LPXNode AppendChild( LPCTSTR name = NULL, LPCTSTR value = NULL );
LPXNode AppendChild( LPXNode node );
bool RemoveChild( LPXNode node );
LPXNode DetachChild( LPXNode node );

// node/branch copy
void CopyNode( LPXNode node );
void CopyBranch( LPXNode branch );
void _CopyBranch( LPXNode node );
LPXNode AppendChildBranch( LPXNode node );

// modify attribute
LPXAttr GetAttr( int i );
XAttrs::iterator GetAttrIterator( LPXAttr node );
LPXAttr CreateAttr( LPCTSTR anem = NULL, LPCTSTR value = NULL );
LPXAttr AppendAttr( LPCTSTR name = NULL, LPCTSTR value = NULL );
LPXAttr AppendAttr( LPXAttr attr );
bool RemoveAttr( LPXAttr attr );
LPXAttr DetachAttr( LPXAttr attr );

// operator overloads
LPXNode operator [] ( int i ) { return GetChild(i); }
XNode& operator = ( XNode& node ) { CopyBranch(&node); return *this; }

_tagXMLNode() { parent = NULL; doc = NULL; type = XNODE_ELEMENT; }
~_tagXMLNode();

void Close();
}XNode, *LPXNode;
extern "C" _declspec(dllexport) XNode;

然后出现这个warning,在需要导入的工程中,根本找不到导出的东西

g:\mydesktop\新建文件夹\xmlparser\xmlite.h(133) : warning C4091: '__declspec(dllexport ) ' : ignored on left of 'struct _tagXMLNode' when no variable is declared
byxdaz 2005-05-30
  • 打赏
  • 举报
回复
跟导出类差不多.比如:
typedef struct tagstructname{
int var1;
bool var2;
char var3;
}structname,*pstructname,FAR * lpstructname;
extern "C" _declspec(dllexport) structname;就可以了

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧