c#

位置:IT落伍者 >> c# >> 浏览文章

C#使用Dllmport来调用dephi的dll


发布日期:2024年02月22日
 
C#使用Dllmport来调用dephi的dll
一般是用非托管的

具体形式如下[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#中是这样引用的

               

上一篇:VC#2005快速入门之使用do语句

下一篇:.NET常用功能和代码(2)