我用常规DLL方式创建了一个工程,用于对一些xml文件解析的封装,返回解析后的数据。因为数据比较复杂。 例如:
 
  Dll 端: 
 class CData {
   wstring str1;
   wstring str2;
 }; class __declspec(dllexport) CXMLHelper {
    bool parsexml( const _bstr_t xmlFilePath, vector<CData>& returnData ); // 要导出的函数
 };  client 端使用: 
  
   vector<CData> data;
   CXMLHelper xmlHelper;
   xmlHelper.parsexml( _bstr_t("c:\\test.xml"), data );  data 怎么也返回不了。如我以上所说的功能,应该如何实现,从DLL中返回一个自定义类的vector数据
 想用这个dll 写了一个class,

解决方案 »

  1.   

    估计返回不了,因为它不是C风格,除非你建扩展DLL。
      

  2.   

    你的DLL和EXE都是使用同一个编译器编译创建的吗? 如果不是还是建议使用C格式的函数来导出DLL接口吧
      

  3.   

    对,我后来改为扩展dll写了一个, 也dialog-based 对client端测了,没有问题. 但我用在用atl建立的框架中用可以返回结果但是老在退出调用涵数时出错,定位在一个xmmemory.h中一个operator delete(ptr) 中,不知道为何。
      

  4.   

    #ifdef DLLEXPORT 
    #define DLLAPI AFX_EXT_CLASS   
    #else
    #define DLLAPI _declspec(dllimport)
    #pragma comment(lib, "./eCopyXMLAssistant.lib")
    #endifclass DLLAPI CXMLAssistant
    {
    public:
    class CDMSRootFolder
    {
    public:
    wstring m_ID;             // 文件夹ID
    wstring m_Name;           // 文件夹名   
    wstring m_Permission;     // 文件夹权限
    wstring m_RootID;         // 文件夹RootID  
    wstring m_ParentID;       // 文件夹ParentID  
    wstring m_Type;           // 文件夹类型(public/private)  
    wstring m_hasSubFolder;   // 文件夹是否有子文件夹
    public:
    CDMSRootFolder( const wstring& ID = _T(""), 
    const wstring& Name = _T(""), 
    const wstring& Permission = _T(""), 
    const wstring& RootID = _T(""),
    const wstring& m_ParentID = _T(""),
    const wstring& Type = _T(""),
    const wstring& hasSubFolder = _T("") );
    CDMSRootFolder( const CDMSRootFolder& DMSRootFolder );
    CDMSRootFolder& operator=( const CDMSRootFolder& DMSRootFolder );
    ~CDMSRootFolder();
    };public:
    CXMLAssistant(void);
    ~CXMLAssistant(void);
             // 解析客户发送获取Root级folder请求的XML
    bool _stdcall ParseRootFolderXML(_bstr_t& xmlString,
    vector<CDMSRootFolder>* pvtDmsRootFolder);
    };client (基于atl) 调用部分         vector<CXMLAssistant::CDMSRootFolder> vtDmsRootFolder;
    if ( XMLAssistant.ParseRootFolderXML( _bstr_t(ReturnInfo.Copy()), 
    &vtDmsRootFolder ) == true )
    {
    int count = vtDmsRootFolder.size();
    for (int ii = 0; ii < count; ii++ )
    {
    wstring str = vtDmsRootFolder[ii].m_ID;
    wstring name = vtDmsRootFolder[ii].m_Name;
    ::MessageBox(NULL, str.c_str(), name.c_str(), MB_OK );
    }  
            } => 在这个时会出错