一般是用非托管的
具体形式如下:[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("user32.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 以及怎么申明
代码
1 public class CompliancePlatDLL
2 {
3 public static string strPath = "";
4 /// <summary>
5 /// 初始化
6 /// </summary>
7 /// <param name="handle"></param>
8 /// <param name="methodAddress"></param>
9 [DllImport("WZFSE.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
10 public static extern void InitDll(IntPtr handle, bool methodAddress);
11 /// <summary>
12 /// 加载相应的服务
13 /// </summary>
14 /// <param name="str"></param>
15 /// <param name="str2"></param>
16 /// <param name="i"></param>
17 /// <returns></returns>
18 [DllImport("WZFSE.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
19 public static extern IntPtr wzLoadModule(string str, string str2, int i);
20 /// <summary>
21 /// 去除相应的服务
22 /// </summary>
23 /// <param name="handle"></param>
24 /// <returns></returns>
25 [DllImport("WZFSE.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
26 public static extern bool wzUnloadModule(IntPtr handle);
27
28 #region API函数
29 /// <summary>
30 /// API函数 设置主辅窗体
31 /// </summary>
32 /// <param name="child"></param>
33 /// <param name="parent"></param>
34 [DllImport("user32.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
35 public static extern void SetParent(IntPtr child, IntPtr parent);
36 /// <summary>
37 /// API函数 移动窗体
38 /// </summary>
39 /// <param name="handler"></param>
40 /// <param name="x"></param>
41 /// <param name="y"></param>
42 /// <param name="width"></param>
43 /// <param name="height"></param>
44 /// <param name="repaint"></param>
45 [DllImport("user32.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
46 public static extern void MoveWindow(IntPtr handler, int x, int y, int width, int height, bool repaint);
47
48 [DllImport("user32.dll", EntryPoint = "GetWindowLong")]
49 public static extern long GetWindowLong(IntPtr hwnd, int nIndex);
50 /// <summary>
51 /// API函数 去除窗体的标题栏
52 /// </summary>
53 /// <param name="hwnd"></param>
54 /// <param name="nIndex"></param>
55 /// <param name="dwNewLong"></param>
56 /// <returns></returns>
57 [DllImport("user32.dll", EntryPoint = "SetWindowLong")]
58 public static extern long SetWindowLong(IntPtr hwnd, int nIndex, long dwNewLong);
59 public const int GWL_EXSTYLE = -16;
60 public const int WS_EX_TRANSPARENT = 0x20;
61 public const int WS_EX_LAYERED = 0x80000;
62 public const int LWA_Alpha = 2;
63 public const int WS_CAPTION = 0xC00000;
64 #endregion
65 }
其中API中的SetWindowLong这个方法是可以实现去除窗体的标题栏的 具体调用SetWindowLong(common.p, GWL_EXSTYLE, GetWindowLong(handle, GWL_EXSTYLE) & (~WS_CAPTION));
但一般完整利用API函数的调用是这样的
代码
1 decallback de1 = new decallback(iscallback);//利用委托
2 InitDll(this.Handle, de1(this.Handle));//初始化
3 IntPtr p = wzLoadModule("DoRiskSetup", "", 0);//取得句柄
4 if (p != (IntPtr)0)//判断该句柄不是弹出窗体时
5 {
6 //去除dephi窗体的标题栏
7 SetParent(p, panel1.Handle);
8 SetWindowLong(p, GWL_EXSTYLE, GetWindowLong(p, GWL_EXSTYLE) & (~WS_CAPTION));
9 MoveWindow(p, 0, 0, panel1.ClientSize.Width, panel1.ClientSize.Height, false);
10 }
其实初用者在调用dll的窗体时 我们只是让他嵌入到自己的系统中 比如C#窗体,这时我们就可能丈二和尚摸不到头脑了 这时我们就需要用底层函数-API函数 其实当我们知道用那个函数调用时,我们可能也会不知道传什么参数发愁。 SetWindowLong(IntPtr handle, int t,long l) 第一个参数为句柄,是你调的dephi窗体的句柄,第二个参数为整型,在dephi用常量GWL_EXSTYLE表示,表示要显示的样式,在C#中翻译过来的他值为(-16),而第三个函则为长整型 和第二个参数一起表示要去除第一个参数句柄窗体的标题栏在dephi中表示为:GetWindowLong(handle,GWL_EXSTYLE) and (not WS_CAPTION) 在C#中则翻译为:GetWindowLong(handle,-16)&(~0xC00000),handle还是指要调用的dephi窗体的句柄,GetWindowLong这个函数是获得该窗体的相关信息。大体上是这个用法,如有不懂大家可以提出来 共同探讨。
上图为C#窗体调用的dephi的情况。
注:上面的dll的名称只是个例子 具体还要看你要引用哪个dll API中的函数在C#中是这样引用的