C# 跨平臺呼叫C++的函式指標

iDotNetSpace發表於2008-09-09
此文主要講一下列子,通過列子就能很清楚的看到是如何用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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章