C#调用C++ 平台调用P/Invoke 结构体--结构体嵌套【八】

普通的结构体嵌套很简单,C#中直接定义成对应的结构体即可,这里介绍的是嵌套的结构体以指针的方式表达

【1】嵌套结构体指针

C++代码:

typedef struct _testStru10Pre
{
	int  iVal;
}testStru10Pre;
typedef struct _testStru10
{
	testStru10Pre *pPre;
	long		  lVal;
	_testStru10()
	{
		pPre = NULL;
	}
}testStru10;
EXPORTDLL_API void Struct_NestStruct( testStru10 *pStru )
{
	if (NULL == pStru)
	{
		return;
	}

	pStru->lVal = 10;
	if (NULL != pStru->pPre)
	{
		pStru->pPre->iVal = 9;
	}

	wprintf(L"Struct_NestStruct \n");
}

C#代码:定义为IntPtr需要进行解析:

public struct testStru10Pre
{
    public int iVal;
};
public struct testStru10
{
    public IntPtr pPre;
    public int lVal;
};
[DllImport("ExportDll.dll", CharSet = CharSet.Unicode)]
public static extern void Struct_NestStruct(ref testStru10 pStru);

测试:

CExportDll.testStru10Pre str10Pre = new CExportDll.testStru10Pre();
IntPtr intPtrStru10Pre = Marshal.AllocCoTaskMem(Marshal.SizeOf(str10Pre));
Marshal.StructureToPtr(str10Pre, intPtrStru10Pre, false);

CExportDll.testStru10 stru10 = new CExportDll.testStru10();
stru10.pPre = intPtrStru10Pre;
CExportDll.Struct_NestStruct(ref stru10);
CExportDll.testStru10Pre str10Pre2 = (CExportDll.testStru10Pre)Marshal.PtrToStructure(stru10.pPre, typeof(CExportDll.testStru10Pre));

Marshal.DestroyStructure(intPtrStru10Pre, typeof(CExportDll.testStru10Pre));
时间: 2024-10-06 08:22:15

C#调用C++ 平台调用P/Invoke 结构体--结构体嵌套【八】的相关文章

C#调用C++ 平台调用P/Invoke 结构体--输入输出参数、返回值、返出值、结构体数组作为参数【五】

[1]结构体作为输入输出参数 C++代码: typedef struct _testStru1 { int iVal; char cVal; __int64 llVal; }testStru1; EXPORTDLL_API void Struct_Change( testStru1 *pStru ) { if (NULL == pStru) { return; } pStru->iVal = 1; pStru->cVal = 'a'; pStru->llVal = 2; wprintf(

C#调用C++ 平台调用P/Invoke 结构体--含有内置数据类型的一维、二维数组、字符串指针【六】

[1]结构体中含有内置数据类型的一维数组 C++代码: typedef struct _testStru3 { int iValArrp[30]; WCHAR szChArr[30]; }testStru3; EXPORTDLL_API void Struct_ChangeArr( testStru3 *pStru ) { if (NULL == pStru) { return; } pStru->iValArrp[0] = 8; lstrcpynW(pStru->szChArr, L&quo

C#调用C++ 平台调用P/Invoke 结构体--内存对齐方式、union封装【七】

[1]内存对齐方式 C++代码: #pragma pack(push) #pragma pack(1) typedef struct _testStru2 { int iVal; char cVal; __int64 llVal; }testStru2; #pragma pack(pop) EXPORTDLL_API void Struct_PackN( testStru2 *pStru ) { if (NULL == pStru) { return; } pStru->iVal = 1; pS

C#调用C/C++动态库 封送结构体,结构体数组

因为公司一直都是做C++开发的,因客户需要要提供C#版本接口,研究了一下C#,发现其强大简洁, 在跨语言调用方面封装的很彻底,提供了强大的API与之交互.这点比JNA方便多了. Java与C#都只能调用C格式导出动态库,因为C数据类型比较单一,容易映射. 两者都是在本地端提供一套与之映射的C#/java描述接口,通过底层处理这种映射关系达到调用的目的. 一. 结构体的传递 Cpp代码   #define JNAAPI extern "C" __declspec(dllexport) /

Net调用非托管代码(P/Invoke与C++InterOP) [转]

将 System::String 转换为 wchar_t* 或 char* PtrToStringChars将String转换为本机wchar_t *或char *.由于 CLR 字符串为内部 Unicode,因此这样通常会返回一个 Unicode 宽字符串指针.然后可以将其转换为宽字符串 1 .Net互操作 .Net不能直接操作非托管代码,这时就需要互操作了. 1.1 P/Invoke 许多常用Windows操作都有托管接口,但是还有许多完整的 Win32 部分没有托管接口.如何操作呢?平台调

C#中跨线程的调用的方法--this.invoke

private void button1_Click(object sender, EventArgs e) { Thread thread = new Thread(new ThreadStart(display)); thread.Start(); } private void display() { while (true) { Thread.Sleep(100); this.Invoke(new threadcall(SetText2)); } } int count = 0; publ

Java基础之结构-->>条件结构与循环结构

Java中程序流程控制语句包括条件结构.循环结构和跳转语句 4.1条件结构 条件结构包括顺序结构和选择结构.顺序结构在程序执行中没有跳转和判断,知道程序结束为止.选择结构包括 if 语句,if-else 语句,switch 语句,在程序执行过程中可以改变程序的执行流程. 4.1.1 if 语句 if 语句是条件判断后再处理的一种语法结构 if(条件表达式){ //条件成立后执行 一条或多条语句 } //条件表达式的值只能是 boolean 类型 false / true 4.1.2 if-els

结构体位结构

位结构     位结构是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构 比按位运算符更加方便. 位结构定义的一般形式为:      struct位结构名{            数据类型 变量名: 整型常数;            数据类型 变量名: 整型常数;       } 位结构变量;  其中: 数据类型必须是int(unsigned或signed). 整型常数必须是非负的整数, 范围是0~15, 表示二进制位的个数, 即表示有多少位. 变量名是选择项, 可以不命名, 这样

java里的分支语句--程序运行流程的分类(顺序结构,分支结构,循环结构)

JAVA里面的程序运行流程分三大类: 1,顺序结构:顺序结构就是依次执行每一行代码 2,分支结构:分支结构就是按不同的条件进行分支 3,循环结构:一段代码依条件进行循环执行. 其中,分支结构有两大类: if...else...结构和switch...结构       switch中的case支持的数据类型只有四种:    char  (字符型)    byte  (比特型)    short (短整型)    int     (整型) 注意switch里面的判断语句后面需要加break,否则的话