C# 跨平台调用C++的函数指针

此文主要讲一下列子,通过列子就能很清楚的看到是如何用C#去调用C++的代码的.

列子:在C++的一个标准Win32 api 库ccLic.dll中有一个函数void* WINAPI GetFunctionAddress(unsigned int sn);此函数通过传sn序号得到函数指针即一个函数的地址.之后再通过返回回来的地址进行其它函数的调用

    那么我们必须知道.一个sn号对应的函数结构如 sn=1 -> bool WINAPI CCAskServerLicenseInfo(const char* server_address,unsigned short port,PCcLic_Info plicenseinfo)

在其中

typedef struct _CcLic_Info {

char ower[64];

unsigned short manage_ip;

unsigned short ramained_ip;

unsigned short useable_time;

unsigned char type;

} CcLic_Info,*PCcLic_Info;

此列的目的就是通过C#调用 CCAskServerLicenseInfo 函数.

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt
        [DllImport(
@" ccLic.dll " )]
        
public   static   extern  System.IntPtr Matrix(System.UInt32 sn);//声名入口函数
//定义函数指针模型
        
public   delegate  System.Int32 CCAskServerLicenseInfoHandle(System.String servername, System.UInt16 port, System.IntPtr ptr);

        
public   static  LicenseInfo GetLicentInfo(String server, System.UInt16 port)
        {

            System.IntPtr fPtr = Matrix(8);//获得CCAskServerLicenseInfo地址           CCAskServerLicenseInfoHandle CCAskServerLicenseInfo = Marshal.GetDelegateForFunctionPointer(fPtr, typeof(CCAskServerLicenseInfoHandle)) as CCAskServerLicenseInfoHandle;//将地址转换为C#中的函数指针

            LicenseInfo info  =   new  LicenseInfo();//声名结构并初始化
            IntPtr infoPtr 
=  Marshal.AllocCoTaskMem(Marshal.SizeOf(info));//将结构体转换为指针
            CCAskServerLicenseInfo(server, port, infoPtr);//调用函数
            info 
=  (LicenseInfo)Marshal.PtrToStructure(infoPtr,  typeof (LicenseInfo));//将指针转换为结构体
            
return  info;
        }

 [StructLayout(LayoutKind.Sequential, CharSet 
=  CharSet.Ansi)]
    
public   struct  LicenseInfo
    {
        [MarshalAs(UnmanagedType.ByValArray, SizeConst 
=   64 )]
        
public  System.Char[] ower; //  LICENSE拥有者
         public  System.UInt16 manage_ip;  //  总授权安装点数
         public  System.UInt16 ramained_ip; //  还剩余可安装点数
         public  System.UInt16 useable_time;  //  授权使用时间
         public  System.Byte type; //  授权类型(1,正式,0,试用)
    }

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12639172/viewspace-442654/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/12639172/viewspace-442654/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值