一般是用非托管的
具體形式如下
[DllImport(
WZFSE
dll
CharSet = CharSet
Ansi
CallingConvention = CallingConvention
StdCall)]
下面緊接著他的申明函數
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(
user
dll
CharSet = CharSet
Ansi
CallingConvention = CallingConvention
StdCall)]
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(
WZFSE
dll
CharSet = CharSet
Ansi
CallingConvention = CallingConvention
StdCall)]
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(
WZFSE
dll
CharSet = CharSet
Ansi
CallingConvention = CallingConvention
StdCall)]
public static extern IntPtr wzLoadModule(string str
string str
int i)
/// <summary>
/// 去除相應的服務
/// </summary>
/// <param name=
handle
></param>
/// <returns></returns>
[DllImport(
WZFSE
dll
CharSet = CharSet
Ansi
CallingConvention = CallingConvention
StdCall)]
public static extern bool wzUnloadModule(IntPtr handle)
#region API函數
/// <summary>
/// API函數 設置主輔窗體
/// </summary>
/// <param name=
child
></param>
/// <param name=
parent
></param>
[DllImport(
user
dll
CharSet = CharSet
Ansi
CallingConvention = CallingConvention
StdCall)]
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(
user
dll
CharSet = CharSet
Ansi
CallingConvention = CallingConvention
StdCall)]
public static extern void MoveWindow(IntPtr handler
int x
int y
int width
int height
bool repaint)
[DllImport(
user
dll
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(
user
dll
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(common
p
GWL_EXSTYLE
GetWindowLong(handle
GWL_EXSTYLE) & (~WS_CAPTION))
但一般完整利用API函數的調用是這樣的
代碼
decallback de
= new decallback(iscallback)
//利用委托
InitDll(this
Handle
de
(this
Handle))
//初始化
IntPtr p = wzLoadModule(
DoRiskSetup
)
//取得句柄
if (p != (IntPtr)
)//判斷該句柄不是彈出窗體時
{
//去除dephi窗體的標題欄
SetParent(p
panel
Handle)
SetWindowLong(p
GWL_EXSTYLE
GetWindowLong(p
GWL_EXSTYLE) & (~WS_CAPTION))
MoveWindow(p
panel
ClientSize
Width
panel
ClientSize
Height
false)
}
其實初用者在調用dll的窗體時 我們只是讓他嵌入到自己的系統中 比如C#窗體
這時我們就可能丈二和尚摸不到頭腦了 這時我們就需要用底層函數
API函數 其實當我們知道用那個函數調用時
我們可能也會不知道傳什麼參數發愁
SetWindowLong(IntPtr handle
int t
long l) 第一個參數為句柄
是你調的dephi窗體的句柄
第二個參數為整型
在dephi用常量GWL_EXSTYLE表示
表示要顯示的樣式
在C#中翻譯過來的他值為(
)
而第三個函則為長整型 和第二個參數一起表示要去除第一個參數句柄窗體的標題欄在dephi中表示為
GetWindowLong(handle
GWL_EXSTYLE) and (not WS_CAPTION) 在C#中則翻譯為
GetWindowLong(handle
)&(~
xC
)
handle還是指要調用的dephi窗體的句柄
GetWindowLong這個函數是獲得該窗體的相關信息
大體上是這個用法
如有不懂大家可以提出來 共同探討
點擊查看大圖
上圖為C#窗體調用的dephi的情況
注
上面的dll的名稱只是個例子 具體還要看你要引用哪個dll API中的函數在C#中是這樣引用的
From:http://tw.wingwit.com/Article/program/net/201311/11747.html