c#调用c++方法介绍,window api

例子1如下:


代码如下:

//声明部分

[DllImport("um_web_client.dll")]
  private static extern int CheckUserName(string UserName);

//

public static int AuthUserName(string username)
  {
   if(!IsConnection())
   {
    StartWebClient(UDBClientIP,UDBClientPort,UDBClientTimeout);
   }
   return CheckUserName(username);
  }

但是如果c++方法中用了指针或者结构体等则引用就要注意,相应就要用到引用数组或者指针,例子2:

声明部分


代码如下:

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi )]
  public class tagPlayerInfoOut
  {
   public int id;
   public String PlayerName;
   public int Country;
   public int OfficerRace;
   public int Level;
   public int MilitaryRank;
   public int Money;
   public int ResourceCount;
   public int CityCount;
   public int GeneralCount;
   public int Credit;
  }

[ StructLayout( LayoutKind.Sequential )]
  public struct tagPlayerInfoOutEx
  {
   public int id;
   public IntPtr PlayerName;
   public int Country;
   public int OfficerRace;
   public int Level;
   public int MilitaryRank;
   public int Money;
   public int ResourceCount;
   public int CityCount;
   public int GeneralCount;
   public int Credit;
  }

[DllImport("um_web_client.dll")]
  public static extern int GetPlayerListCs(int maxrows, out int rows,  out IntPtr playerlist);

[DllImport("um_web_client.dll")]
  public static extern int GetPlayerListCs(int maxrows, out int rows, tagPlayerInfoOutEx** playerlist);

方法


代码如下:

public static DataTable UsingMarshal()
  {
   if(!IsConnection())
   {
    StartWebClient(UDBClientIP,UDBClientPort,UDBClientTimeout);
   }
   DataTable dt = new DataTable();

dt.Columns.Add("id");
   dt.Columns.Add("PlayerName");
   dt.Columns.Add("Country");
   dt.Columns.Add("OfficerRace");
   dt.Columns.Add("Level");
   dt.Columns.Add("MilitaryRank");
   dt.Columns.Add("Money");
   dt.Columns.Add("ResourceCount");
   dt.Columns.Add("CityCount");
   dt.Columns.Add("GeneralCount");
   dt.Columns.Add("Credit");

int size = 0;
   IntPtr outArray;
   GetPlayerListCs(20, out size, out outArray);
   tagPlayerInfoOut[] manArray = new tagPlayerInfoOut[size];
   IntPtr current = outArray;
   //Console.WriteLine("记录数{0}",size);

for( int i = 0; i < size; i++ )
   {
    manArray[ i ] = new tagPlayerInfoOut();
    Marshal.PtrToStructure(current, manArray[i]);
    Marshal.DestroyStructure(current, typeof(tagPlayerInfoOut) );
    current = (IntPtr)((long)current + Marshal.SizeOf(manArray[i]));

dt.Rows.Add(new object[] {manArray[i].id,manArray[i].PlayerName,manArray[i].Country,manArray[i].OfficerRace,manArray[i].Level,manArray[i].MilitaryRank,manArray[i].Money,manArray[i].ResourceCount,manArray[i].CityCount,manArray[i].GeneralCount,manArray[i].Credit});

dt.AcceptChanges();
   //Console.WriteLine( "Element {0}: {1} {2}", i, manArray[i].id, manArray[i].PlayerName);
  }
   Marshal.FreeCoTaskMem(outArray);
   return dt;
  }

public static unsafe DataTable UsingUnsafe()
  {
   int size;
   if(!IsConnection())
   {
    StartWebClient(UDBClientIP,UDBClientPort,UDBClientTimeout);
   }
   DataTable dt = new DataTable();

dt.Columns.Add("id");
   dt.Columns.Add("PlayerName");
   dt.Columns.Add("Country");
   dt.Columns.Add("OfficerRace");
   dt.Columns.Add("Level");
   dt.Columns.Add("MilitaryRank");
   dt.Columns.Add("Money");
   dt.Columns.Add("ResourceCount");
   dt.Columns.Add("CityCount");
   dt.Columns.Add("GeneralCount");
   dt.Columns.Add("Credit");
   tagPlayerInfoOutEx* pResult;
   GetPlayerListCs(20,  out size, &pResult );
   tagPlayerInfoOutEx* pCurrent = pResult;
   //Console.WriteLine("记录数{0}",size);

for( int i = 0; i < size; i++, pCurrent++ )
   {
    //Console.WriteLine( "Element {0}: {1} {2}", i, pCurrent->id ,Marshal.PtrToStringAnsi(pCurrent->PlayerName));
    //Marshal.FreeCoTaskMem(pCurrent->PlayerName );
    dt.Rows.Add(new object[] {pCurrent->id,pCurrent->PlayerName,pCurrent->Country,pCurrent->OfficerRace,pCurrent->Level,pCurrent->MilitaryRank,pCurrent->Money,pCurrent->ResourceCount,pCurrent->CityCount,pCurrent->GeneralCount,pCurrent->Credit});

dt.AcceptChanges();
   }
   Marshal.FreeCoTaskMem((IntPtr)pResult );
   return dt;
  }

(0)

相关推荐

  • C# 调用C++写的dll的实现方法

    dll的编写,首先是打开VS新建一个C++的控制台程序,下一步后选择dll以及空文档即可.然后就是添加一个类添加一个方法.方法排头固定格式 extern"C"__declspec(dllexport) 后面加方法即可. 例如如下代码: C++dll代码: 复制代码 代码如下: extern"C"__declspec(dllexport) char* ShowImages(BYTE img[],int w,int h){;} C#调用dll基本也是固定格式,如下样式,

  • c++函数转c#函数示例程序分享

    复制代码 代码如下: using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Runtime.InteropServices;using System.Windows.Forms; namespace FDEP{    /// <summary>    /// 罗旭成    /// 深证通函数转换    /// </summary>    publi

  • C#调用C++版本dll时的类型转换需要注意的问题小结

    C#对于C++的dll引用时,经常会遇到类型转换和struct的转换 1. C++ 里的Char类型是1 个字节,c#里的Char是两个字节,不可以对应使用:可使用c#里的byte对应 2. structType temp = (structType)Marshal.PtrToStructure(IntPtr, typeof(structType));说明:此方式转换只针对包含c++基本类型的结构体,如果包含指针数组的结构体,使用泛型函数比较方便. 3. [StructLayoutAttribu

  • C++联合体转换成C#结构的实现方法

    本文实例主要参考MSDN:http://msdn.microsoft.com/zh-cn/library/ya9bz4ha%28v=vs.80%29.aspx 最近因为项目中遇到了C++联合体转换成C#结构的情况,查了很多资料才转换成功. 备注:对于官方这个UNION示例,我的简单理解,就是这类UNION做法,可适当代替IF ELSE 之类操作. 解决问题:如果只接收视频解码数据,而从不接收音频数据,那么是否可以直接定义结构体,并以此来获取视频数据. /// <summary> /// * @

  • C++调用C#的DLL实现方法

    SwfDotNet是C#编写的,这是个特别好的读写Swf文件的库.本文讲述了在C++项目中,怎么让C++调用C#的DLL动态链接库文件. 具体的实现步骤如下: 一.创建C# DLL,需要指定应用类型为"类库",代码: namespace CSLib { public class Class1 { private string name; public string Name { get { return name; } set { name = "Your Name: &qu

  • C++中const的实现细节介绍(C,C#同理)

    1.什么是const?  常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的.(当然,我们可以偷梁换柱进行更新:) 2.为什么引入const?  const 推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点. 3.cons有什么主要的作用? (1)可以定义const常量,具有不可变性. 例如:  const int Max=100; int Array[Max]; (2)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患.例如:

  • 浅析C#与C++相关概念的比较

    1.在C#中,class的变量为引用类型,在C++中class的变量为值类型,如myclass mc,在C++中,mc是值类型,成员存储在程序的栈区,在C#中,mc是引用类型,指向堆中的成员. 2.switch语句,C#中case后面可根字符串,如case "abc",但在C++中却不行,C++中case后面只跟数字,字符,和枚举. 3.在C#中没有C++中的私有继承和保护继承,只有公有继承. 4.C#中可以通过关键字sealed把一个类声明为密封类,即不能被作为父类被继承出派出类,在

  • C#的锯齿数组以及C++实现代码

    原则: 1.锯齿数组首先是二维数组,第一维的维数是确定的 2.之所以在C#中能够出现灵活的锯齿数组,是因为,C#的数组是引用类型(本质上存放的是指针) 根据这个引用类型(指针)的概念,C++中用指针数组同样可以实现 C#中: class A{} int szA[][] = new int[3][]; szA[0] = new int[2]; szA[1] = new int[6]; szA[2] = new int[3]; 当然此时实际的各个数组元素(整形变量)尚未初始化值,C#不允许使用未经初

  • c++与c#的时间转换示例分享

    1.C++中的时间:(1) time_t其实是一个64位的long int类型(2) time函数:函数简介:函数名:  time 头文件:  time.h 函数原型:time_t time(time_t *timer) 功能: 获取当前的系统时间,返回的结果是一个time_t类型,其实就是一个大整数,其值表示从CUT(Coordinated Universal Time)时间1970年1月1日00:00:00(称为UNIX系统的Epoch时间)到当前时刻的秒数,然后调用localtime将ti

  • c#调用c++方法介绍,window api

    例子1如下: 复制代码 代码如下: //声明部分 [DllImport("um_web_client.dll")]  private static extern int CheckUserName(string UserName); // public static int AuthUserName(string username)  {   if(!IsConnection())   {    StartWebClient(UDBClientIP,UDBClientPort,UDBC

  • php调用新浪短链接API的方法

    本文实例讲述了php调用新浪短链接API的方法.分享给大家供大家参考.具体方法如下: 复制代码 代码如下: <?php //Sina App_Key define('SINA_APPKEY', '31641035'); function curlQuery($url) {  //设置附加HTTP头  $addHead = array(  "Content-type: application/json"  );  //初始化curl,当然,你也可以用fsockopen代替  $cu

  • C#调用WebService的方法介绍

    一.前言 在日常工作中,如果涉及到与第三方进行接口对接,有的会使用WebService的方式,这篇文章主要讲解在.NET Framework中如何调用WebService.首先我们创建一个WebService,里面有两个方法:一个无参的方法,一个有参的方法: 创建好了WebService以后,把WebService部署到IIS上,并确保可以访问 二.静态引用 这种方式是通过添加静态引用的方式调用WebService.首先创建一个Winform程序,界面上有一个按钮,点击按钮调用WebServic

  • Spring事务传播中嵌套调用实现方法详细介绍

    目录 前言 7种传播方式 注解式事务 事务的方法之间的调用 注意事项 前言 最近在使用Spring框架时遇到了一些问题,主要是Spring的事务传播问题,一个不带事务的方法调用带事务的方法,有时候会出现不回滚的情况,所以写了这篇文章来记录一下. 7种传播方式 我们先来看Spring事务的7中传播方式以及对应的描述 属性名称 值 描述 PROPAGATION__REQUIRED REQUIRED 表示的是当前这个方法必须运行在一个事务环境中,如果当前方法已经处于事务环境中,就可以直接使用该方法,否

  • React Hooks获取数据实现方法介绍

    目录 前言 useState useEffect 获取数据 前言 react16.8推出hooks更好的支持函数组件,使用函数组件更容易进行代码的复用,拓展性更强. useState useState类似于class组件的state功能,用于更新视图 import React, { Component, useState } from 'react'; export default function Hello() { const [count, setCount] = useState(0);

  • js防止页面被iframe调用的方法

    本文实例讲述了js防止页面被iframe调用的方法.分享给大家供大家参考.具体实现方法如下: 一.问题描述: 有时候我们发会现自己的网站页面被别人调用并且一模一样,这个其实就是简单的iframe调用了,下面我来给大家介绍js防止页面iframe调用的方法总结吧,有需要的朋友可参考 二.解决方法: 防止自己的网页被人框架: top.location.href 最上层的地址 windows.location.href自己的地址 self指代当前窗口对象,属于window最上层的对象; locatio

  • JavaScript中setter和getter方法介绍

    javascript中的setter.getter是平时接触比较少的方法,其本身也并不是标准方法,只在非ie浏览器里支持(ie内核也许有其他方法可以做到呢?暂时不知其解),但是加以利用可以做许多事情,比如: 1.对数据的访问限制: a.value是对value变量的getter方法调用,如果在getter方法实现中抛出异常,可以阻止对value变量的访问 2.对dom变量进行监听: window.name是一个跨域非常好用的dom属性(大名鼎鼎,详见百度),如果覆盖window.name的set

  • [ASP.NET AJAX]Function对象及Type类的方法介绍

    上一回我们从总体上认识了JavaScript Microsoft AJAX Library由于临时有事,没有加入事例显得有点抽象,这一回一定会通过一些事例更加直观的来会一会Asp.NET Ajax脚本库中一个很是重要的类Type.这个类提供了一些扩展面向对象编程的一些反射方法,通过这个类我们可以注册类似.NET中的一些(如:命名空间,类,枚举等等)基本类型.这个Type类继承自window是一个Global类型,不属于任何命名空间.下面我们来看看Type中的一些基本方法以及是怎样实一些方法的实现

  • JavaScript跨域调用基于JSON的RESTful API

    1. 基本术语 AJAX(Asynchronous JavaScript And XML,异步JavaScript和XML):AJAX是一种用于创建快速动态网页的技术,通过在后台与服务器进行少量数据交换,AJAX可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. JSON(JavaScript Object Notation):JSON是一种轻量级的数据交换格式,可以看成是由大括号包裹起来的多个"key/value"对,格式如下:{"f

  • Js调用Java方法并互相传参的简单实例

    Js通过PhoneGap调用Java方法并互相传参的. 一.JAVA代码 写一个类,该类继承自Plugin并重写execute方法. import org.json.JSONArray; import android.app.Activity; import android.app.AlertDialog; import android.content.ActivityNotFoundException; import android.content.DialogInterface; impor

随机推荐