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:

感谢师傅指导.

DLL返回自定义结构的数组相关推荐

  1. c语言调用dll实例 结构体传参,Matlab调用Dll,对于自定义结构体数组如何传参? - 程序语言 - 小木虫 - 学术 科研 互动社区...

    %[例子1] % Matlab调用DLL,整形数组传参 v = [1,22,33;44,-56,67]; pv = libpointer('int16Ptr',v); m = get(pv,'Valu ...

  2. 托管代码C#调用非托管C++ API, 封送嵌套结构体数组

    一.前言: 最近这两天由于项目需要,提供给客户的C++ 动态库需要返回自定义结构体数组,网上也查了很多资料, 推荐一本书, <精通.NET互操作:P/Invoke.C++ Interop和COM ...

  3. C#调用C++DLL传递结构体数组的终极解决方案

    在项目开发时,要调用C++封装的DLL,普通的类型C#上一般都对应,只要用DllImport传入从DLL中引入函数就可以了.但是当传递的是结构体.结构体数组或者结构体指针的时候,就会发现C#上没有类型 ...

  4. c oracle udt,c#调用Oracle UDT自定义结构数组类型源代码

    [实例简介] c#调用Oracle UDT自定义结构数组类型源代码 [实例截图] [核心代码] ffa2062d-cc85-43bf-9aeb-2cf440e254c3 └── vsstart └── ...

  5. C语言试题五十一之已知学生的记录是由学号和学习成绩构成,n名学生的数据已存入s结构体数组中。请编写函数fun,该函数的功能是:找出成绩最高的学生记录,通过形参返回主函数(规定只有一个最高分)。

    1. 题目 请编写一个函数void function(Student a[], int n, Student *s),其功能时:已知学生的记录是由学号和学习成绩构成,n名学生的数据已存入s结构体数组中 ...

  6. C语言编程题—结构体—设计程序,已知学生的记录由学号和学习成绩构成,N名学生的数据已存入a结构体数组中。请编写函数 fun:找出成绩最低的学生记录,通过形参返回主函数(规定只有一个最低分

    4 C语言编程题--结构体 **设计程序,已知学生的记录由学号和学习成绩构成,N名学生的数据已存入a结构体数组中.请编写函数 fun,函数的功能是:找出成绩最低的学生记录,通过形参返回主函数(规定只有 ...

  7. C语言编程>第十二周 ③ 已知学生的记录由学号和学习成绩构成,M名学生的数据已存入a结构体数组中。请编写函数fun,该函数的功能是:找出成绩最高的学生记录,通过形参返回主函数。

    已知学生的记录由学号和学习成绩构成,M名学生的数据已存入a结构体数组中.请编写函数fun,该函数的功能是:找出成绩最高的学生记录,通过形参返回主函数(规定只有一个最高分).已给出函数的首部,请完成该函 ...

  8. C语言自定义数据类型(二)使用结构体数组

    一个结构体变量中可以存放一组有关联的数据(如一个学生的学号.姓名.成绩等数据).如果有 10 个学生的数据需要参加运算,显然应该用数组,这就是结构体数组.结构体数组与以前介绍过的数值型数组的不同之处在 ...

  9. 【C 语言】二级指针案例 ( 字符串切割 | 返回 自定义二级指针 作为结果 | 每个 一级指针 指向不同大小内存 | 精准分配每个 一级指针 指向的内存大小 )

    文章目录 一.二级指针案例 ( 返回自定义二级指针 | 精准控制内存大小 ) 二.完整代码示例 一.二级指针案例 ( 返回自定义二级指针 | 精准控制内存大小 ) 博客 [C 语言]二级指针案例 ( ...

最新文章

  1. Android include 标签
  2. kali2020.1正确安装下载中文输入法及问题解决
  3. 孙鑫VC++课程中用到的函数一览
  4. 单片机原理及其应用——单片机控制按键依次点亮8只发光二极管
  5. most recent call last 报错_视频|救援情景剧、创意快闪……400w+人次为重庆这场消防宣传活动打call...
  6. Echarts笔记-折线图定制(Y轴百分数,鼠标移动显示百分数,显示X轴,Y轴值)
  7. mac 10.13 配置 php,MacOS10.13.6 升级后 PHP7.3配置
  8. Hbase完全分布式高可用集群安装配置
  9. 尝试使用Java6API读取java代码
  10. RedHat Linux安装Informix v10.x(图文详解)
  11. linux ifort编译命令,[转载][Linux] icc与ifort编译器
  12. 中国电信与阿里巴巴签署全面战略合作协议
  13. 人口普查数据有疑问???
  14. numpy.loadtxt() 详细用法
  15. 云服务(腾讯云)的安全防范措施
  16. 借记卡、贷记卡叫法的由来
  17. 我的形码输入法[C语言] 之一:输入法的字词编码
  18. Autodesk的照片建模云服务—Autodesk ReCap 360 photo 的测试数据
  19. 对话哈希未来贾英昊:资产上链的第一性原理 |链捕手
  20. “希希敬敬对”队软件工程第九次作业-beta冲刺第二次随笔

热门文章

  1. 为什么选用 React 创建混合型移动应用?
  2. hdu2716水水哈希
  3. Linux 下的NFS server 架设基础及方法
  4. 页面如何让它不显示标题栏,菜单栏,工具栏,地址栏
  5. java 代码性能优化_Java代码性能优化(四)
  6. centos6 安装 mantisbt-1.2.8 —— (2)【linux】VMware安装CentOS 6.4
  7. centos7 远程连接其他服务器redis
  8. Linux查看CPU相关信息
  9. 【转】supervisord使用
  10. 编写微信小程序常用到的界面参数