您的位置:首页 > 编程语言 > C语言/C++

DllImport的相关用法(C# 中调用C++ DLL)

2017-03-20 10:06 519 查看
【最近在写程序时需要用到将鼠标限定在某个区域内的功能,也找到了一些方法,其中有关DllImport的用法不是很理解,就搜索了一些内容。】

(原文)http://www.cnblogs.com/howard-queen/archive/2008/07/31/1257127.html

为了能用上原来的C++代码,只好研究下从C# 中调用DLL

首先必须要有一个声明,使用的是DllImport关键字: 

包含DllImport所在的名字空间 

using System.Runtime.InteropServices; 
public class XXXX

{

[DllImport(“MyDLL.dll")] 
public static extern int mySum (int a,int b); 



[DllImport(“MyDLL.dll")] 

public static extern int mySum (int a,int b); 

代码中DllImport关键字作用是告诉编译器入口点在哪里,并将打包函数捆绑在这个类中 

在类中的时候调用直接mySum(a,b);就可以了 

在其他类中调用: XXXX. mySum(a,b); 

[DllImport(“MyDLL.dll”)]在申明的时候还可以添加几个属性 
[DllImport(“MyDLL.dll", EntryPoint=" mySum ",CharSet=CharSet.Auto,CallingConvention=CallingC

其他参考请搜索:

在C#程序设计中使用Win32类库

C#中调用C++托管Dll

如何在C#中加载自己编写的动态链接库

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

(原文)http://bbs.csdn.net/topics/260042671

DllImport 属性的常见用法。第一节讨论使用 DllImport 从托管应用程序调用本机代码的优点。第二节集中讨论封送处理和 DllImport 属性的各个方面。

从托管应用程序调用非托管代码

当在托管应用程序中重用现有的非托管代码时,DllImport 属性非常有用。例如,托管应用程序可能需要调用非托管 WIN32 API。

下面的代码示例说明此通用方案,此示例将调用 MessageBox(位于 User32.lib 中):

#using <mscorlib.dll>

using namespace System::Runtime::InteropServices; 

// for DllImportAttribute

namespace SysWin32

{

   [DllImport("user32.dll", EntryPoint = "MessageBox", CharSet = Unicode)]

   int MessageBox(void* hWnd, wchar_t* lpText, wchar_t* lpCaption, 

                  unsigned int uType);

}

int main( )

{

   SysWin32::MessageBox( 0, L"Hello world!", L"Greetings", 0 );

}

主要注意包含 DllImport 的代码行。此代码行根据参数值通知编译器,使之声明位于 User32.dll 中的函数并将签名中出现的所有字符串(如参数或返回值)视为 Unicode 字符串。如果缺少 EntryPoint参数,则默认值为函数名。另外,由于 CharSet 参数指定 Unicode,因此公共语言运行库将首先查找称为 MessageBoxW(有 W 是因为 Unicode 规范)的函数。如果运行库未找到此函数,它将根据调用约定查找 MessageBox 以及相应的修饰名。受支持的调用约定只有 __cdecl 和 __stdcall。

当调用用户定义的 DLL 中所包含的函数时,有必要将 extern "C" 添加在 DLL 函数声明之前,如下所示:

// The function declaration in SampleDLL.h file

extern "C" SAMPLEDLL_API int fnSampleDLL(void);

有关受支持的其他参数值的更多信息,请参见 DllImport。

将非结构化参数由托管封送处理为非托管

除使用上述方法外,还可以使用另一种方法将托管参数(来自托管应用程序)封送处理为非托管参数(在非托管 DLL 中)。

以下代码示例说明封送处理技术:

#using <mscorlib.dll>

using namespace System; // To bring System::String in

using namespace System::Runtime::InteropServices; 

// for DllImportAttribute

namespace SysWin32

{

   [DllImport("user32.dll", EntryPoint = "MessageBox", CharSet = Unicode)]

   Int32 MessageBox( Int32 hWnd, String* lpText, String* lpCaption, 

                     UInt32 uType );

}

int main( )

{

   SysWin32::MessageBox(0, S"Hello world!", S"Greetings", 0);

}

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

(原文)http://bbs.csdn.net/topics/260042671

常用的三大模块:

user32.dll

是Windows用户界面相关应用程序接口,用于包括Windows处理,基本用户界面等特性,如创建窗口和发送消息

gdi32.dll

gdi32.dll是Windows GDI图形用户界面相关程序,包含的函数用来绘制图像和显示文字

kernel32.dll

控制着系统的内存管理、数据的输入输出操作和中断处理

微软就是靠这三个模块起家的

Windows SDK只利用这三个模块就能构建基本的Windows程序
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: