结构只能以地址方式进行传递,dll只能传递结构不能传递类

VS端:

[DllImport(@"D:\程序\VC程序\MfcDllspace\Debug\space.dll")]

private static extern bool PassStruct(IntPtr skintptr);

[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]

public struct sngk //定义结构

{

public double jin ;

public double wei;

public int gao;

public sngk(double j,double w,int g) //VS结构可以包含带参数的构造函数,而VC可以包含不带参数的构造函数

{

jin = j;

wei = w;

gao = g;

}

}

sngk sk = new sngk(50,60,10); //初始化结构

int size = Marshal.SizeOf(sk); //

ntPtr objPtr = Marshal.AllocHGlobal(size); //分配内存空间

Marshal.StructureToPtr(sk, objPtr, false);// 值写入分配的空间

PassStruct (objPtr); //将结构传入VC++dll端处理

sk = (sngk)Marshal.PtrToStructure(objPtr, typeof(sngk)); //重新取出处理后的值

Marshal.FreeHGlobal(objPtr);//释放内存空间

VC++ Dll端:

//#pragma pack(push,1) //这两句据说是为了统一字节大小占一位还是两位,目前去掉也没问题

struct sngk

{

double jin;

double wei;

int gao;

sngk()

{

jin=0;

wei=0;

gao=0;

}

};

//#pragma pack(pop)

extern "C" __declspec(dllexport) bool fetchInfos(sngk* sk) //只能定义结构指针 补充,也可用&

{

sk->jin*=2;

sk->wei*=2;

sk->gao*=2;

return true;

}

2015.3.5 VS2005调用VC6 dll 时结构参数的传递的更多相关文章

  1. 2015.3.4 VS2005调用MFC dll时报错及解决

    今天在用VS2005调用MFCdll时报错: 正试图在 os 加载程序锁内执行托管代码.不要尝试在 DllMain 或映像初始化函数内运行托管代码... 原因是我在dll的CSpaceApp::CSp ...

  2. 关于C# 调用 C dll时,抓获C的异常

    最近一直被C# 调用native code时的内存错误,各种错误所困扰.而且在.net 4.0中非托管代码的异常不能被托管代码抓获,导致程序直接crash. 最终找到了.net 的方法.MSDN有关于 ...

  3. C#调用C++ dll时,结构体引用传参的方法

    写了一个C++的LogLog Logit 四参数等算法的接口dll,给C#调用,但是发现传参有问题 如 extern "C" _declspec(dllexport)  bool ...

  4. [K/3Cloud] 调用其他界面时通过Session传递对象参数

    DynamicFormShowParameter参数的CustomParams参数列表只支持string类型的参数,对于复杂参数的传递需要通过单据View对象的共享Session来完成,如: 在调用界 ...

  5. 2015.5.9 C#编写DLL及C#调用C#DLL

    过程比C#调用VC++dll简单. 一.创建DLL 新建工程,类型选择类库,生成的结果就是dll 注意:在项目属性-应用程序中,注意三个地方,程序集名称和默认命名空间可以调整,但要一致,别的程序调用此 ...

  6. 外壳exe通过反射调用dll时

    外壳exe通过反射调用dll时,dll是 4.0的框架,外壳exe也需要编译成4.0的框架,如果dll本身有调用32位的dll,那么外壳exe也需要编译成32位. 调试时报的那个错,直接继续运行,不影 ...

  7. 无法将类型为“Excel.ApplicationClass”的 COM 对象强制转换为接口类 型“Excel._Application”。此操作失败的原因是对 IID 为“{000208D5 -0000-0000-C000-000000000046}”的接口的 COM 组件调用 QueryInterface 因以下错误而失败: 加载类型库/DLL 时出错。 (异常来 自 HRESULT:

    无法将类型为“Excel.ApplicationClass”的 COM 对象强制转换为接口类 型“Excel._Application”.此操作失败的原因是对 IID 为“{000208D5 -000 ...

  8. C#调用dll时的类型转换总结

    C++(Win 32) C# char** 作为输入参数转为char[],通过Encoding类对这个string[]进行编码后得到的一个char[] 作为输出参数转为byte[],通过Encodin ...

  9. 当程序调用dll时获取dll路径,DLL中获取自身的句柄

    当程序调用dll时,获取dll路径的方法: HMODULE hMod = GetModuleHandle(_T("axload.dll")); if (hMod != NULL) ...

随机推荐

  1. BZOJ2764 [JLOI2011]基因补全

    Description 在 生物课中我们学过,碱基组成了DNA(脱氧核糖核酸),他们分别可以用大写字母A,C,T,G表示,其中A总与T配对,C总与G配对.两个碱基序列能相互 匹配,当且仅当它们等长,并 ...

  2. 51nod 1363 最小公倍数的和 欧拉函数+二进制枚举

    1363 最小公倍数之和 题目来源: SPOJ 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 给出一个n,求1-n这n个数,同n的最小公倍数的和.例如:n = 6,1,2,3 ...

  3. ODPS中的TaskContext类里面的write函数

    ODPS中的TaskContext类有几个write函数 write(Record record)用来输出到默认输出表 write(Record record, String label)用来输出的l ...

  4. zoj3229 有源汇上下界最大流

    题意:有一个人每天给妹子拍照,每个妹子有最少拍照数,每天有最大拍照数,每天只能给某些特定的妹子拍照,求最大拍照数 题解:很容易看出来的有源汇上下界最大流,对于有源汇 的上下界最大流,我们按照无源汇的操 ...

  5. Beautifusoup

    text = soup.find('div', {'class': 'mulu'}) #查找目录,坑死我了.就这个东西,知乎上看别人写的爬取网络小说,这个最适合我.我一开始老是使用beautifuls ...

  6. Object.assign()与深拷贝(一)

    深拷贝与浅拷贝 所谓深拷贝与浅拷贝,是围绕引用类型变量的拷贝进行的讨论. 在ECMAScript中,变量分为基本类型和引用类型两种.其本质区别是不可变性,基本类型是不可变的,而引用类型是可变的. 所谓 ...

  7. 【Oracle】实现Oracle数据库对象的一键升级

    引言     公司内部的项目比较倾向于将业务逻辑放在oracle存储过程中实现,所以每次项目升级都涉及到很多的oracle表,存储过程等数据库对象的升级.然而采取的升级方式是比较"原始&qu ...

  8. Spring_总结_02_依赖注入

    一.前言 本文承接上一节:Spring_总结_01_Spring概述 在上一节中,我们了解了Spring的最根本使命.四大原则.六大模块以及Spring的生态. 这一节我们开始了解Spring的第二大 ...

  9. LeetCode OJ:Minimum Path Sum(最小路径和)

    Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...

  10. hdoj-1013-Digital Roots(九余数定理)

    题目链接 #include <iostream> using namespace std; int main() { string a; int b; ") { b = ; ;i ...