熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

C#使用Dllmport來調用dephi的dll

2013-11-13 09:51:11  來源: .NET編程 
    一般是用非托管的
    具體形式如下[DllImport(WZFSEdll CharSet = CharSetAnsi CallingConvention = CallingConventionStdCall)]
下面緊接著他的申明函數
    public static extern void InitDll(IntPtr handle bool methodAddress)
    申明一個函數就要引用下他的dll
    IntPtr這個類型可以申明為其他語言的句柄指針等
    若要實現其他語言類似C++的函數指針形式 這時我們考慮用C#的委托來實現
    將dephi的窗體簽入到自己的C#系統裡 還有一點比較重要我們是調用dephi的窗體此時顯示在我們C#窗體中會有dephi的窗體
    這時我們怎麼辦呢  怎麼去除dephi中的窗體呢  這時我們就需要用API函數了 API函數在dephi有 C#中也有
    在C#中是這麼引用的 [DllImport(userdll CharSet = CharSetAnsi CallingConvention = CallingConventionStdCall)]
    public static extern void MoveWindow(IntPtr handler int x int y int width int height bool repaint)
    下面插入一個類 這裡面包含了怎麼引用dephi的dll 以及怎麼申明
    代碼
      public class CompliancePlatDLL
         {
             public static string strPath = ;
             /// <summary>
             /// 初始化
             /// </summary>
             /// <param name=handle></param>
             /// <param name=methodAddress></param>
             [DllImport(WZFSEdll CharSet = CharSetAnsi CallingConvention = CallingConventionStdCall)]
             public static extern void InitDll(IntPtr handle bool methodAddress)
             /// <summary>
             /// 加載相應的服務
             /// </summary>
             /// <param name=str></param>
             /// <param name=str></param>
             /// <param name=i></param>
             /// <returns></returns>
             [DllImport(WZFSEdll CharSet = CharSetAnsi CallingConvention = CallingConventionStdCall)]
             public static extern IntPtr wzLoadModule(string str string str int i)
             /// <summary>
             /// 去除相應的服務
             /// </summary>
             /// <param name=handle></param>
             /// <returns></returns>
             [DllImport(WZFSEdll CharSet = CharSetAnsi CallingConvention = CallingConventionStdCall)]
             public static extern bool wzUnloadModule(IntPtr handle)
   
             #region API函數
             /// <summary>
             /// API函數 設置主輔窗體
             /// </summary>
             /// <param name=child></param>
             /// <param name=parent></param>
             [DllImport(userdll CharSet = CharSetAnsi CallingConvention = CallingConventionStdCall)]
             public static extern void SetParent(IntPtr child IntPtr parent)
             /// <summary>
             /// API函數 移動窗體
             /// </summary>
             /// <param name=handler></param>
             /// <param name=x></param>
             /// <param name=y></param>
             /// <param name=width></param>
             /// <param name=height></param>
             /// <param name=repaint></param>
             [DllImport(userdll CharSet = CharSetAnsi CallingConvention = CallingConventionStdCall)]
             public static extern void MoveWindow(IntPtr handler int x int y int width int height bool repaint)
   
             [DllImport(userdll EntryPoint = GetWindowLong)]
             public static extern long GetWindowLong(IntPtr hwnd int nIndex)
             /// <summary>
             /// API函數 去除窗體的標題欄
             /// </summary>
             /// <param name=hwnd></param>
             /// <param name=nIndex></param>
             /// <param name=dwNewLong></param>
             /// <returns></returns>
             [DllImport(userdll EntryPoint = SetWindowLong)]
             public static extern long SetWindowLong(IntPtr hwnd int nIndex long dwNewLong)
             public const int GWL_EXSTYLE = ;
             public const int WS_EX_TRANSPARENT = x;
             public const int WS_EX_LAYERED = x;
             public const int LWA_ALPHA = ;
             public const int WS_CAPTION = xC;
             #endregion
         }
    其中API中的SetWindowLong這個方法是可以實現去除窗體的標題欄的  具體調用SetWindowLong(commonp GWL_EXSTYLE GetWindowLong(handle GWL_EXSTYLE) & (~WS_CAPTION))


    但一般完整利用API函數的調用是這樣的
    代碼
              decallback de = new decallback(iscallback)//利用委托
                    InitDll(thisHandle de(thisHandle))//初始化
                    IntPtr p = wzLoadModule(DoRiskSetup //取得句柄
                    if (p != (IntPtr))//判斷該句柄不是彈出窗體時
                    {
                        //去除dephi窗體的標題欄
                        SetParent(p panelHandle)
                        SetWindowLong(p GWL_EXSTYLE GetWindowLong(p GWL_EXSTYLE) & (~WS_CAPTION))
                        MoveWindow(p panelClientSizeWidth panelClientSizeHeight false)
                    }
    其實初用者在調用dll的窗體時 我們只是讓他嵌入到自己的系統中 比如C#窗體這時我們就可能丈二和尚摸不到頭腦了  這時我們就需要用底層函數API函數  其實當我們知道用那個函數調用時我們可能也會不知道傳什麼參數發愁 SetWindowLong(IntPtr handle int tlong l) 第一個參數為句柄是你調的dephi窗體的句柄第二個參數為整型在dephi用常量GWL_EXSTYLE表示表示要顯示的樣式在C#中翻譯過來的他值為(而第三個函則為長整型 和第二個參數一起表示要去除第一個參數句柄窗體的標題欄在dephi中表示為GetWindowLong(handleGWL_EXSTYLE) and (not WS_CAPTION) 在C#中則翻譯為GetWindowLong(handle)&(~xChandle還是指要調用的dephi窗體的句柄GetWindowLong這個函數是獲得該窗體的相關信息大體上是這個用法如有不懂大家可以提出來 共同探討
 
                                          點擊查看大圖
    上圖為C#窗體調用的dephi的情況
    注上面的dll的名稱只是個例子 具體還要看你要引用哪個dll  API中的函數在C#中是這樣引用的


From:http://tw.wingwit.com/Article/program/net/201311/11747.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.