调用C++DLL时遇到结构体类型难题

问题描述

C++DLL里的一个函数:HRESULTDSStream_EnumVideoCompressor(VideoCompressorInfo*pInfo,int*piVidCompNum)得到系统中安装的视频压缩算法的信息。pInfo:指向一片预先分配的VideoCompressorInfo结构。如果为NULL,piVidCompNum将得到系统中安装的视频压缩算法的数目。piVidCompNum:如果pInfo不为NULL,piVidCompNum表示pInfo中包含多少个VideoCompressorInfo结构。如果pInfo等于NULL,piVidCompNum返回系统中安装的视频压缩算法的数目。//-------------------------------------------------------------------typedefstructVIDEOCOMPRESSORINFO{charszName[256];DWORDdwHandle;}VideoCompressorInfo;//------------------------C#封装------------------------------------[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]publicstructVideoCompressorInfo{[MarshalAs(UnmanagedType.ByValArray,SizeConst=256)]publicStringBuilderszName;publicInt32dwHandle;}//------------------------------------------------[DllImport("DSStream.dll")]publicstaticexternintDSStream_EnumVideoCompressor(IntPtrpInfo,refintpiVidCompNum);//-----------------------------------------------调用代码:XNStream.VideoCompressorInfo[]pInfo;intnum=0;intResult=XNStream.DSStream_EnumVideoCompressor(IntPtr.Zero,refnum);if(Result==0&&num>0){for(inti=0;i<num;++i){pInfo[i].szName=newStringBuilder(256);}intsize=Marshal.SizeOf(typeof(XNStream.VideoCompressorInfo));IntPtrstructPtr=Marshal.AllocHGlobal(size*num);Result=XNStream.DSStream_EnumVideoCompressor(structPtr,refnum);if(Result==0){pInfo=newXNStream.VideoCompressorInfo[num];for(inti=0;i<num;++i)pInfo[i]=Marshal.PtrToStructure(structPtr+i*size,typeof(XNStream.VideoCompressorInfo));//出错点,第一个参数:运算符+无法应用于IntPtr和int类型的操作数Marshal.FreeHGlobal(structPtr);StringBuilders=newStringBuilder();for(inti=0;i<pInfo.Length;i++){s.Append(pInfo[i].szName.ToString()+"n");}MessageBox.Show(s.ToString());}}主要是不知道如何对结构体封装,得不到返回的多个值,请大家帮帮忙!谢谢

解决方案

解决方案二:
第一:函數這樣定義[DllImport("DSStream.dll")]publicstaticexternintDSStream_EnumVideoCompressor(VideoCompressorInfopInfo,outintpiVidCompNum);

解决方案三:
pInfo[i].szName=newStringBuilder(256);pInfo沒new哪里來的pInfo[i]?
解决方案四:
函數定義改下[DllImport("DSStream.dll")]publicstaticexternintDSStream_EnumVideoCompressor(VideoCompressorInfo[]pInfo,outintpiVidCompNum);

底下的代碼就更不知所謂,看不懂你想干什么了

时间: 2024-09-12 04:48:11

调用C++DLL时遇到结构体类型难题的相关文章

C#调用c++ dll 封送结构体数组,无法成功

问题描述 C#调用c++ dll 封送结构体数组,无法成功 c++代码: class qf { private: char *id; char *mc; float sd; int LX; }; 函数:int EntryPoint(qf *qfw); c#代码: public class qf { private string id; private string mc; private float sd; private int LX; }; c#调用: qf[] qfw = new qf[2

C++动态分配和撤销内存以及结构体类型作为函数参数_C 语言

C++动态分配内存(new)和撤销内存(delete) 在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除.在C语言中是利用库函数malloc和free来分配和撤销内存空间的.C++提供了较简便而功能较强的运算符new和delete来取代malloc和free函数. 注意: new和delete是运算符,不是函数,因此执行效率高. 虽然为了与C语言兼容,C++仍保留malloc和free函数,但建议用户不用malloc和free函数,而用new和delete运算

结构体类型数据作为函数参数(三种方法)_C 语言

(1)用结构体变量名作为参数. 复制代码 代码如下: #include<iostream>#include<string>using namespace std;struct Student{ string name; int score; };int main(){ Student one; void Print(Student one); one.name="千手"; one.score=99; Print(one); cout<<one.nam

c语言-结构体指针数组指向结构体类型数组的问题

问题描述 结构体指针数组指向结构体类型数组的问题 #include<stdio.h> #include<stdlib.h> struct student { char num; char name[10]; int grade; }; void swap(struct student *p[],int n) { int k,m,i,j; struct student *d; k=0;m=n-1; while(k<m) { j=m-1;m=0; for(i=k;i<=j;

python c++ 传参-python 调用C++函数,关于结构体传参问题

问题描述 python 调用C++函数,关于结构体传参问题 python 调用C++函数,C++函数的参数类型是pyobject*,其实是一个结构体数组 类似于 #define NUM 32 stuct A { int a; int b; }; struct B { int len; A ab[NUM]; } 请问在python中如何将这个结构体数组表示出来并传给 C++函数. 我在python中用类表示的 class A: def init(self): self.a=0 self.b=0 c

dll里面初始化结构体,返回应用程序指向结构体的指针,应用程序可以通过这个指针读取它的成员变量吗

问题描述 dll里面初始化结构体,返回应用程序指向结构体的指针,应用程序可以通过这个指针读取它的成员变量吗 dll里面初始化结构体,返回应用程序指向结构体的指针,应用程序可以直接通过这个指针读取它的成员变量吗? 解决方案 当然是可以的.但是更好的方式是把分配内存的工作交给调用者去做.因为这样不容易忘记释放内存.申请和释放的代码成对出现. 参考windows api里的GetWindowRect,它由调用者传入一个lpRect结构体指针,函数获取了窗口坐标,填充它. 解决方案二: 只要是在同一个

c语言-C语言函数的形参(结构体类型)和实参类型(指针)可以不同吗?

问题描述 C语言函数的形参(结构体类型)和实参类型(指针)可以不同吗? int numstus; int lens; student pointer; void main() { int i=1; char str[2]; lens=100; pointer=(student *)malloc(lens*LEN); /分配内存*/ numstus=0; welcome(); /*欢迎界面*/ while(i>0) { i=menu_select(); /*控制菜单*/ switch(i) { c

xcode-c语言关于结构体类型的函数的返回值return

问题描述 c语言关于结构体类型的函数的返回值return 定义了一个全局变量的结构体,然后又定义了一个结构体类型的函数,函数的返回值如何返回一个空值,显然return 0;是不行的 解决方案 1)可以用结构体指针,因为指针的null是一个典型的"空",相对于int的0更能体现"空值"的含义,也最方便 2)结构体属于你自己定义的变量,所以你也可以规定当这个结构体里面的变量的值是某种情况是,认为这个结构体类型的变量是"空",比如一般意义上的int认为

c# 调用 c++dll 时c#的代码怎么写

问题描述 c# 调用 c++dll 时c#的代码怎么写 #include "stdlib.h " #include #include #include #include "windows.h" #include #define m_col 3 #define m_dim 3 void InvMatrix(const double M[][m_col], const int n, double invM[][m_col]); void LinearFit(const