C#使用Dllmport来调用dephi的dll

来源:网络时间:2011-06-22

  一般是用非托管的

   具体形式如下:[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#使用Dllmport来调用dephi的dll

   上图为C#窗体调用的dephi的情况。

   注:上面的dll的名称只是个例子 具体还要看你要引用哪个dll API中的函数在C#中是这样引用的

发表评论

最新评论(共0条)