当前位置:编程学习 > C#/ASP.NET >>

DllImport("User32.dll")

大侠们!调用这个函数的作用是?该怎么调用?
.NET 里面经常调用的外部系统函数还有哪些?举例说明吧 --------------------编程问答--------------------  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);
}
--------------------编程问答--------------------
引用 1 楼 ericzhangbo1982111 的回复:
DllImport 属性的常见用法。第一节讨论使用 DllImport 从托管应用程序调用本机代码的优点。第二节集中讨论封送处理和 DllImport 属性的各个方面。 

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

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

#using <mscorlib.dll> 
u…
--------------------编程问答-------------------- 常用的还有"Kernel32.dll",也可以引入自己写的本机dll
有了dllimport可以方便的调用win32API --------------------编程问答-------------------- mark --------------------编程问答--------------------
引用 4 楼 shanying_0 的回复:
mark
--------------------编程问答--------------------
引用 5 楼 ojekleen 的回复:
引用 4 楼 shanying_0 的回复:
mark

remarkble --------------------编程问答-------------------- 剛接觸。。。
   學習了 --------------------编程问答-------------------- 直接在reference里加也是一样的吧 --------------------编程问答-------------------- 底层的有些dll文件c#是不能添加引用的 只有通过dllimport调用 --------------------编程问答-------------------- http://blog.csdn.net/jame_peng/archive/2009/07/28/4387906.aspx --------------------编程问答--------------------
引用 1 楼 ericzhangbo1982111 的回复:
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);
 }


又见高手 --------------------编程问答-------------------- 常用的三大模块:

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

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

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

微软就是靠这三个模块起家的
Windows SDK只利用这三个模块就能构建基本的Windows程序 --------------------编程问答-------------------- 这么多回复。。
囧~!。
--------------------编程问答--------------------
引用 2 楼 fly_to_the_winds 的回复:
引用 1 楼 ericzhangbo1982111 的回复:
 DllImport 属性的常见用法。第一节讨论使用 DllImport 从托管应用程序调用本机代码的优点。第二节集中讨论封送处理和 DllImport 属性的各个方面。

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

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

 #using  <mscorlib.dll>
 u… 
--------------------编程问答-------------------- 學習,學習 --------------------编程问答-------------------- 努力学习知识,顶楼主 --------------------编程问答-------------------- 帮顶 --------------------编程问答--------------------
引用 12 楼 yangglemu 的回复:
常用的三大模块:

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

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

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

微软就是靠这三个模块起……

学习 --------------------编程问答-------------------- 不错
学习 --------------------编程问答-------------------- C# 中调用C++ DLL (P/Invoke)
http://www.cnblogs.com/howard-queen/archive/2008/07/31/1257127.html --------------------编程问答-------------------- C#的平台调用,请参考:
创建Win32 DLL,并在C#里面调用

另外,遇到这样的问题,可以先google搜索后,再问具体的。例如怎么调用某个函数等。 --------------------编程问答-------------------- 一般用于调用系统的api --------------------编程问答-------------------- mark --------------------编程问答-------------------- 學習了 --------------------编程问答-------------------- 举个非常简单的例子说明,产品化的时候,一般都用加密狗的手段,但是想添加引用,或者使用加密狗中的算法或检测时,需要加载其光盘内带的DLL:Rockey3Com.dll,需要用运行regsvr32 注册,或者用[DllImport("Rockey3Com.dll")]的方法来自动注册,之后才可以使用的~一般都写在安装类里,或者程序启动,根据其DLL的标识来检测是否注册过。这样才可以使用的。

我知道的方法是必须得放在项目启动路径下,或sys32文件夹下,不需要写路径,就写名字可以直接注册的。 --------------------编程问答-------------------- 看看。 --------------------编程问答-------------------- 不错握,,谢谢,学习了。 --------------------编程问答--------------------
引用 12 楼 yangglemu 的回复:
常用的三大模块:

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

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

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

微软就是靠这三个模块起……


又见高手 
不错 哈哈 --------------------编程问答-------------------- 这完全就是 C# 这个 OO 调用 Native Methods 的不二法门啊。

当你想更自由地控制窗体的时候,就这么用。毕竟,上层封装给你的东西,是用起来方便,其实,你是受限的了。 --------------------编程问答-------------------- 来学习一下,顺便帮顶! --------------------编程问答-------------------- 学习了 --------------------编程问答-------------------- 学习了··好多高YIN啊
--------------------编程问答--------------------
引用 12 楼 yangglemu 的回复:
常用的三大模块:

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

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

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

微软就是靠这三个模块……


长见识 --------------------编程问答--------------------
引用 21 楼 computerfox 的回复:
C#的平台调用,请参考:
创建Win32 DLL,并在C#里面调用

另外,遇到这样的问题,可以先google搜索后,再问具体的。例如怎么调用某个函数等。

平台调用吧. --------------------编程问答--------------------
引用 1 楼 ericzhangbo1982111 的回复:
DllImport 属性的常见用法。第一节讨论使用 DllImport 从托管应用程序调用本机代码的优点。第二节集中讨论封送处理和 DllImport 属性的各个方面。

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

下面的代码示例说明此通用方案,此示例将调用 Mes……


!!! --------------------编程问答-------------------- 呵呵,接口问题, --------------------编程问答-------------------- .net framework的核心就是DllImport.
--------------------编程问答-------------------- 说个实例看看啊,我也搞不懂啊 --------------------编程问答-------------------- ding --------------------编程问答-------------------- 常用的基本就是这三个
user32.dll
gdi32.dll
kernel32.dll
--------------------编程问答-------------------- 学习下 --------------------编程问答-------------------- 学习中…… --------------------编程问答--------------------
引用 12 楼 yangglemu 的回复:
常用的三大模块:

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

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

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

微软就是靠这三个模块起……


学习,谢谢大神~ --------------------编程问答-------------------- 学习了,高手 --------------------编程问答-------------------- 不错,真的学习了 --------------------编程问答-------------------- xuexizhong --------------------编程问答--------------------
引用 18 楼 freshairyz25 的回复:
引用 12 楼 yangglemu 的回复:
常用的三大模块:

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

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

kernel32.dll
控制着系统的内存管理、数据的输……



好啊 --------------------编程问答-------------------- 刚好遇到这个问题,也是不知道DllImport是干嘛的,学习了,谢谢诶。 --------------------编程问答-------------------- 在这里看了很久。。。。。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,