• DLL返回自定义结构的数组


    Txml.h 自定义了结构体 与对应的类

    View Code
    typedef enum {
        CHOICE_STYLE_OTHER,
        CHOICE_STYLE_TEXT,
        CHOICE_STYLE_IMG

    }ChoiceStyle;

    typedef 
    struct {
        
    char CIID;
        ChoiceStyle EnumChoiceStyle;        
        
    char ChoicePath[MAXPATH];    
        
    char ChoiceContent[MAXQCONTENT];

    }ChoiceItem;

    typedef 
    struct {
        
    char QID[MAXID];     
        
    char QContent[MAXQCONTENT];
        
    char ContentAudio[MAXPATH];
        ChoiceItem ChoiceItemA;            
        ChoiceItem ChoiceItemB;            
        ChoiceItem ChoiceItemC;            
        ChoiceItem ChoiceItemD;        
        
    char Answer[1];

    }QuestionItem;
     

    class Txml
    {
    public:
     Txml();
     ~Txml();
    private:
     
     QuestionItem QuestionItemArray[MAXARRAYSIZE];
     int QuestionItemArraySize;

     
    public:

     int LoadXml(const char *XmlFilePath);
     QuestionItem QueryQuestionbyID(char *ID);
     QuestionItem* QueryQuestionArray();

    };

    Txml.cpp

    int Txml::LoadXml(const char *XmlFilePath)
    {
    //加载XmlFilePath
    //将其读到QuestionItemArray中
    }
    QuestionItem* Txml:: QueryQuestionArray()//注意声明的返回的是自定义结构的指针
    {
         
    //注意返回的是数组名(地址)
         
    //此前犯错,返回第一个元素QuestionIte[0]
        return QuestionItemArray;
    }

    DLL实现如下:

    MyDLL.h

    extern "C" __declspec(dllexport) void  *FillQuestionItem(const char* FileName);

    MyDLL.cpp

    void   *FillQuestionItem(const char* FileName)
    {
        QuestionItem 
    *QuestionItemP;

        Txml 
    *objTxml= new Txml();
        objTxml
    ->LoadXml(FileName);
        QuestionItemP 
    = (objTxml->QueryQuestionArray());    
        
    return QuestionItemP;
        
    }

    应用层调用的核心部分:

    View Code
    //加载测试配置文件
    void CMyExam2Dlg::LoadTXml(const char *szXmlFileToSave)
    {
        typedef 
    void*  (*pFillQuestionItem)(const char* FileName);


        HINSTANCE HDLL;                   
    //定义句柄
        
        pFillQuestionItem FillQuestionItem;    

        HDLL
    =LoadLibrary(MyDLLPath);   

        
    //加载动态链接库FIRSTDll.dll文件,注意指明FIRSTDLL的地址哦
        if(HDLL==NULL) 
            ::OutputDebugString(
    "cannot find the dll file");

        
    int my_int = *(int*)GetProcAddress(HDLL, "nMyDLL");
        
        FillQuestionItem
    =(pFillQuestionItem)GetProcAddress(HDLL,"FillQuestionItem"); 

        QuestionItem 
    *QuestionItemP;
        QuestionItem QuestionItemP1[
    10];
        QuestionItemP
    =(QuestionItem*)FillQuestionItem(szXmlFileToSave );


        memcpy(QuestionItemP1, QuestionItemP, 
    sizeof(QuestionItem) * 10);    

        FreeLibrary(HDLL);
    //卸载MyDll.dll文件;
    }

    自定义的xml结构

    View Code
    <?xml version="1.0" encoding="gb2312" ?> 
    <resource id="20110512171112">
    <Question id="0">
      
    <Content>1</Content> 
      
    <ContentAudio>.\01.mp3</ContentAudio> 
      
    <Choice STYLE="TEXT">a</Choice> 
      
    <Choice STYLE="TEXT">b</Choice> 
      
    <Choice STYLE="TEXT">c</Choice> 
      
    <Choice STYLE="TEXT">d</Choice> 
      
    <Answer>B</Answer> 
      
    </Question>
    <Question id="1">
      
    <Content>2</Content> 
      
    <ContentAudio>.\02.mp3</ContentAudio> 
      
    <Choice STYLE="TEXT">2</Choice> 
      
    <Choice STYLE="TEXT">2</Choice> 
      
    <Choice STYLE="TEXT">2</Choice> 
      
    <Choice STYLE="TEXT">2</Choice> 
      
    <Answer>B</Answer> 
      
    </Question>
    ......
    repeat more 8 times
    </resource>

    PS:

    感谢师傅指导.

  • 相关阅读:
    将vs2010换成vs2012的主题
    写了个油猴脚本
    Myeclipse10下的access数据库配置
    点击按钮触发声音(xaml实现)
    自定义的可拖动窗体
    在博客添加时钟
    定时器写的闪光字
    C语言I博客作业02
    c语言|博客作业02
    关于软件工程的一些疑问
  • 原文地址:https://www.cnblogs.com/no7dw/p/2050373.html
Copyright © 2020-2023  润新知