网站首页 > 文章中心 > 其它

vb.net的api接口

作者:小编 更新时间:2023-10-23 10:13:24 浏览量:363人看过

VB.Net中该怎么调用windows的API?

①Windows的API有两个版本的,比如ANSI的FindWindowA(),Unicode的FindWindowW()

Shared Function FindWindow(ByVal className As String, ByVal windowName As String) As IntPtr

End Function

VB.NET的API调用

现在我用我所知道的为楼主介绍VB.NET的API调用,请楼主浏览一下,看看行不行.

Windows API就是Windows系统的API函数简称(Application Program Interface,即:应用程序接口函数),它是Windows操作系统提供给各种开发基于Windows平台应用软件的开发语言的一些公用的函数,这些函数一般都比较底层,所以当各种开发语言使用自带的函数或类库已无法解决问题时,调用Windows API函数往往是一种非常直接、有效的解决方法.但由于在程序中调用Windows API函数一般都很复杂,所以对于程序员来说,是否能够灵活的使用Windows API函数,往往也是其水平高低的一个重要标志.但自从微软推出.Net框架以后,各种开发基于.Net平台下的程序语言,如Visual Basic .Net、Visual C#等却很少使用Windows API函数,并且微软公司也不像以前那样,提倡在这些.Net开发语言中使用Windows API函数,其主要的原因如下:

① .Net框架所附带的类库.Net FrameWork SDK是一个内容丰富、功能强大的软件开发包,各种Windows API函数所实现的各种功能几乎都可以在这个软件开发包中找到与之对应的部分.

虽然微软并不提倡在Visual Basic .Net、Visual C#中调用Windows API函数,但由于目前.Net 框架推出时间较短,.Net FrameWork SDK中提供的类库还并不足以完全替换Windows API函数的所有功能,所以在某些时候,.Net开发语言还是必须要调用Windows API函数.

一.平台调用、托管DLL、非托管DLL简介:

托管DLL就是能够在公共语言运行库(Common Language Runtime,简称CLR)中能够直接引用的,并且扩展名为"DLL"的文件.具体所指就是封装各种命名空间所在的DLL文件,如System.dll等.非托管DLL就是平常所的动态链接库等,其中就包括了封装所有Windows API函数的DLL文件.各种非托管DLL中的函数在公共语言运行库中不能直接被调用,而需要经过.Net框架提供的"平台调用"服务后才可以.

"平台调用"是.Net框架为Visual Basic .Net、Visual C#等.Net开发语言提供的一种服务,用以在托管代码中引入各种非托管DLL中封装的函数(其中包括Windows API函数)."平台调用"依赖于元数据在运行时查找导出函数并封装其参数.图01公共语言运行库利用"平台服务"调用非托管DLL中的函数的流程图:

图01:"平台服务"的调用非托管函数的流程图

在托管代码中使用"平台调用"服务调用非托管DLL中封装的函数时,"平台服务"将依次执行以下操作:

①.. 查找包含该函数所在的DLL文件.

在Visual Basic .Net中使用"平台调用"服务,申明Windows API函数主要有二种具体的实现方法:

①.. 使用DllImport特征类来申明Windows API函数.

这二种方法虽有异曲同工之效,但在繁简上却有很大差异,第一种方法申明过程比较复杂,很容易在申明Windows API函数时出错,所以并不提倡.而第二种方法相对简单,并且又保存了以前Visual Basic中的很多语法,所以在平常时大都使用这种方法来申明Windows API函数.

二.VB.Net查看文件中图标的函数及申明Windows API的方法:

(1).使用DllImport特征类来申明Windows API函数:

下面是在Visual Basic .Net中使用DllImport特征类申明二个Windows API函数的具体示例:

'函数ExtractIcon,其功能是是从指定文件的指定位置导出图标的Windows句柄.

Public Function _

'函数Icon_Num,其功能是获得指定文件中的图标数目

Icon_Num ( ByVal src As System.IntPtr , ByVal strFileName As string , ByVal uiIconIndex As Integer ) As Integer

在使用DllImport特征类申明Windows API函数时,如果申明的函数名称和函数的入口点相同,则可以在申明Windows API函数时,省略定义函数入口点对应的代码,即EntryPoint对象字段对应的代码,这样声明ExtractIcon函数的代码也可以简化为如下所示:

使用"Declare"语句的确比使用DllImport特征类要简单了许多,下面是在Visual Basic .Net中使用"Declare"语句来声明上述二个Windows API函数的具体方法:

'声明ExtractIcon函数

'声明Icon_Num函数

在Visual Basic .Net中声明Windows API函数时,"Declare"语句中Alias关键字的作用相当于使用DllImport特征类中的EntryPoint对象字段.同样在使用"Declare"语句声明Windows API函数时,如果声明的函数和函数的入口点相同,也可以省略Alias关键字对应的代码,所以ExtractIcon函数也可以简化为如下:

下面就结合一个示例的编写过程来掌握的这二个Windows API函数的具体使用方法,这个示例的作用就是读取指定文件中的图标数目,并显示文件中的图标.

三.本文中程序的编写、调试和运行环境:

四.Visual Basic .Net读取文件中的图标的实现步骤:

下面介绍的示例,其功能读取指定文件中包含的图标数目,并把这些图标全部显示出来.下面是这个示例的实现步骤:

① 启动Visual Studio .Net.

四个Label组件,其中二个用以显示提示信息,另外二个分别用以显示选择的文件名称和这个文件中包含的图标数目.

一个ListView组件,利用其显示大图标的属性用以显示选定文件中的图标.

一个OpenFileDialog组件,用以选择要查看图标的文件名称.

一个ImageList组件,它起的是桥梁的作用,首先把从文件中导出的图标存放到这里,然后再提供ListView组件显示出来.

一个Button组件.

①.0. 按照表01中数值来设定设定组件的主要属性:

组件类型 组件名称 属性 设置结果

Form Form1 Text VB.NET查看文件中的图标

Form1 MaximizeBox False

Form1 MinimizeBox False

Form1 FormBorderStyle FixedSingle

ListView ListView1 ImageList1 LargeImageList

ListView1 MultiSelect False

Button Button1 Text 选择文件

Button1 FlatStyle Flat

ImageList1 TransparentColor Color.Transparent

Label Label1 Text 文件名称:

表01:【Visual Basic .Net查看文件中的图标】项目窗体中各组件的主要属性设定数值表

Private Sub Button1_Click ( ByVal sender As System.Object , ByVal e As System.EventArgs ) Handles Button1.Click

If OpenFileDialog1.ShowDialog ( ) = DialogResult.OK Then

'清除组件中的所有项目

ListView1.Items.Clear ( )

ImageList1.Images.Clear ( )

Dim sfName As String = OpenFileDialog1.FileName

Dim iIcon_Num As Integer = Icon_Num ( IntPtr.Zero , sfName , -1 )

'显示文件中的图标数目

Dim i As Integer

For i = 0 To iIcon_Num - 1 Step 1

'强制实现int到uint类型转换

Dim hIcon As System.IntPtr = ExtractIcon ( IntPtr.Zero , sfName , j )

'在imageList1组件中加入当然提取的图标

ImageList1.Images.Add ( Icon.FromHandle ( hIcon ).ToBitmap ( ) )

'在ListView组件中加入一个项目

ListView1.Items.Add ( "第" + ( i + 1 ).ToString ( ) + "个图标" )

'把加入项目的图象索引指向刚才加入图标在imagList1组件中的索引,从而显示图标

ListView1.Items ( i ).ImageIndex = i

Next i

End If

End Sub

五.总结:

解决Visual Basic .Net查看文件中的图标的关键并非是使用.Net框架中提供的类库,而是使用Windows的API函数.虽然这与利用Visual Basic .Net开发跨平台程序的初衷相违背,但的确不失为一种解决问题的方法.有些时候通过Windows API函数能够快捷、方便的解决实际问题,而这往往是只使用.Net FrameWork SDK所望尘莫及的,但随着.Net FrameWork SDK内容的不断丰富,各种新的组成部分和新的功能不断加入,可以预见的是,在未来的.Net FrameWork SDK中必将拥有可以替换本文中介绍的二个Windows API函数的组成部分.

VB.net可以调用API吗?怎么调用?比如我要调用Gditransparentbit函数怎么写代

用vb.net做串口通讯程序要调用哪些api函数?

串口API通信函数编程

①OpenComm()打开串口资源,并指定输入、输出缓冲区的大小(以字节计)

CloseComm() 关闭串口;

例:int idComDev;

CloseComm(idComDev);

②BuildCommDCB() 、setCommState()填写设备控制块DCB,然后对已打开的串口进行参数配置; 例:DCB dcb;

SetCommState(dcb);

③ ReadComm 、WriteComm()对串口进行读写操作,即数据的接收和发送.

例:char *m_pRecieve; int count;

ReadComm(idComDev,m_pRecieve,count);

使用ActiveX控件,程序实现非常简单,结构清晰,缺点是欠灵活;使用API 通信函数的优缺点则基本上相反.

使用ActiveX控件:

⑴.在当前的Workspace中插入MSComm控件.

Project菜单------Add to Project----Components and Controls-----Registered

ActiveX Controls---选择Components: Microsoft Communications Control,

结果添加了类CMSComm(及相应文件:mscomm.h和mscomm.cpp ).

⑵.在MainFrm.h中加入MSComm控件.

protected:

CMSComm m_ComPort;

在Mainfrm.cpp::OnCreare()中:

DWORD style=WS_VISIBLE|WS_CHILD;

if (!m_ComPort.Create(NULL,style,CRect(0,0,0,0),this,ID_COMMCTRL)){

TRACE0("Failed to create OLE Communications Control\n");

return -1; // fail to create

}

⑶.初始化串口

m_ComPort.SetCommPort(1); //选择COM?

if(!m_ComPort.GetPortOpen()) //打开串口

m_ComPort.SetPortOpen(TRUE);

m_ComPort.SetInputMode(1); //设置输入方式为二进制方式

m_ComPort.SetRThreshold(1); //为1表示有一个字符引发一个事件

m_ComPort.SetInputLen(0);

⑷.捕捉串口事项.MSComm控件可以采用轮询或事件驱动的方法从端口获取数据.我们介绍比较使用的事件驱动方法:有事件(如接收到数据)时通知程序.在程序中需要捕获并处理这些通讯事件.

在MainFrm.h中:

afx_msg void OnCommMscomm();

DECLARE_EVENTSINK_MAP()

在MainFrm.cpp中:

BEGIN_EVENTSINK_MAP(CMainFrame,CFrameWnd )

ON_EVENT(CMainFrame,ID_COMMCTRL,1,OnCommMscomm,VTS_NONE) //映射ActiveX控件事件

END_EVENTSINK_MAP()

⑸.串口读写. 完成读写的函数的确很简单,GetInput()和SetOutput()就可.两个函数的原型是:

VARIANT GetInput();及 void SetOutput(const VARIANT newValue);都要使用VARIANT类型(所有Idispatch::Invoke的参数和返回值在内部都是作为VARIANT对象处理的).

void CMainFrame::OnCommMscomm(){

VARIANT vResponse; int k;

k=m_commCtrl.GetInBufferCount(); //接收到的字符数目

if(k0) {

vResponse=m_commCtrl.GetInput(); //read

SaveData(k,(unsigned char*) vResponse.parray-pvData);

} // 接收到字符,MSComm控件发送事件 }

..... // 处理其他MSComm控件

void CMainFrame::OnCommSend() {

........ // 准备需要发送的命令,放在TxData[]中

CByteArray array;

array.RemoveAll();

array.SetSize(Count);

for(i=0;iCount;i++)

array.SetAt(i, TxData[i]);

m_ComPort.SetOutput(COleVariant(array)); // 发送数据 }

⑴.在中MainFrm.cpp定义全局变量

HANDLE hCom; // 准备打开的串口的句柄

HANDLE hCommWatchThread ;//辅助线程的全局函数

⑵.打开串口,设置串口

0, // 此项必须为0

NULL, // no security attrs

OPEN_EXISTING, //设置产生方式

FILE_FLAG_OVERLAPPED, // 我们准备使用异步通信

NULL );

我使用了FILE_FLAG_OVERLAPPED结构.这正是使用API实现非阻塞通信的关键所在.

ASSERT(hCom!=INVALID_HANDLE_VALUE); //检测打开串口操作是否成功

SetCommMask(hCom, EV_RXCHAR|EV_TXEMPTY );//设置事件驱动的类型

PurgeComm( hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR

| PURGE_RXCLEAR ); //清干净输入、输出缓冲区

COMMTIMEOUTS CommTimeOuts ; //定义超时结构,并填写该结构

............

SetCommTimeouts( hCom, CommTimeOuts ) ;//设置读写操作所允许的超时

DCB dcb ; // 定义数据控制块结构

GetCommState(hCom, dcb ) ; //读串口原来的参数设置

dcb.StopBits = ONESTOPBIT ;dcb.fBinary = TRUE ;dcb.fParity = FALSE;

SetCommState(hCom, dcb ) ; //串口参数配置

上述的COMMTIMEOUTS结构和DCB都很重要,实际工作中需要仔细选择参数.

⑶启动一个辅助线程,用于串口事件的处理.

Windows提供了两种线程,辅助线程和用户界面线程.辅助线程没有窗口,所以它没有自己的消息循环.但是辅助线程很容易编程,通常也很有用.

在次,我们使用辅助线程.主要用它来监视串口状态,看有无数据到达、通信有无错误;而主线程则可专心进行数据处理、提供友好的用户界面等重要的工作.

hCommWatchThread=

CreateThread( (LPSECURITY_ATTRIBUTES) NULL, //安全属性

0,//初始化线程栈的大小,缺省为与主线程大小相同

(LPTHREAD_START_ROUTINE)CommWatchProc, //线程的全局函数

GetSafeHwnd(), //此处传入了主框架的句柄

0, dwThreadID );

ASSERT(hCommWatchThread!=NULL);

⑷为辅助线程写一个全局函数,主要完成数据接收的工作.请注意OVERLAPPED结构的使用,以及怎样实现了非阻塞通信.

UINT CommWatchProc(HWND hSendWnd){

DWORD dwEvtMask=0 ;

SetCommMask( hCom, EV_RXCHAR|EV_TXEMPTY );//有哪些串口事件需要监视?

WaitCommEvent( hCom, dwEvtMask, os );// 等待串口通信事件的发生

检测返回的dwEvtMask,知道发生了什么串口事件:

if ((dwEvtMask EV_RXCHAR) == EV_RXCHAR){ // 缓冲区中有数据到达

COMSTAT ComStat ; DWORD dwLength;

ClearCommError(hCom, dwErrorFlags, ComStat ) ;

dwLength = ComStat.cbInQue ; //输入缓冲区有多少数据?

if (dwLength 0) { BOOL fReadStat ;

fReadStat = ReadFile( hCom, lpBuffer,dwLength, dwBytesRead,READ_OS( npTTYInfo ) ); //读数据

注:我们在CreareFile()时使用了FILE_FLAG_OVERLAPPED,现在ReadFile()也必须使用

LPOVERLAPPED结构.否则,函数会不正确地报告读操作已完成了.

使用LPOVERLAPPED结构, ReadFile()立即返回,不必等待读操作完成,实现非阻塞

通信.此时, ReadFile()返回FALSE, GetLastError()返回ERROR_IO_PENDING.

if (!fReadStat){

if (GetLastError() == ERROR_IO_PENDING){

while(!GetOverlappedResult(hCom,READ_OS( npTTYInfo ), dwBytesRead, TRUE )){

dwError = GetLastError();

if(dwError == ERROR_IO_INCOMPLETE) continue;//缓冲区数据没有读完,继续

...... ......

::PostMessage((HWND)hSendWnd,WM_NOTIFYPROCESS,0,0);//通知主线程,串口收到数据}

所谓的非阻塞通信,也即异步通信.是指在进行需要花费大量时间的数据读写操作(不仅仅是指串行通信操作)时,一旦调用ReadFile()、WriteFile(), 就能立即返回,而让实际的读写操作在后台运行;相反,如使用阻塞通信,则必须在读或写操作全部完成后才能返回.由于操作可能需要任意长的时间才能完成,于是问题就出现了.

非常阻塞操作还允许读、写操作能同时进行(即重叠操作?),在实际工作中非常有用.

要使用非阻塞通信,首先在CreateFile()时必须使用FILE_FLAG_OVERLAPPED;然后在 ReadFile()时lpOverlapped参数一定不能为NULL,接着检查函数调用的返回值,调用GetLastError(),看是否返回ERROR_IO_PENDING.如是,最后调用GetOverlappedResult()返回重叠操作(overlapped operation)的结果;WriteFile()的使用类似.

⑸.在主线程中发送下行命令.

BOOL fWriteStat ; char szBuffer[count];

............//准备好发送的数据,放在szBuffer[]中

fWriteStat = WriteFile(hCom, szBuffer, dwBytesToWrite,

dwBytesWritten, WRITE_OS( npTTYInfo ) ); //写数据

//我在CreareFile()时使用了FILE_FLAG_OVERLAPPED,现在WriteFile()也必须使用LPOVERLAPPED结构.否则,函数会不正确地报告写操作已完成了.

使用LPOVERLAPPED结构,WriteFile()立即返回,不必等待写操作完成,实现非阻塞 通信.此时, WriteFile()返回FALSE, GetLastError()返回ERROR_IO_PENDING.

int err=GetLastError();

if (!fWriteStat) {

if(GetLastError() == ERROR_IO_PENDING){

while(!GetOverlappedResult(hCom, WRITE_OS( npTTYInfo ),

dwBytesWritten, TRUE )) {

if(dwError == ERROR_IO_INCOMPLETE){// normal result if not finished

dwBytesSent += dwBytesWritten; continue; }

......................

//我使用了多线程技术,在辅助线程中监视串口,有数据到达时依靠事件驱动,读入数据并向主线程报告(发送数据在主线程中,相对说来,下行命令的数据总是少得多);并且,WaitCommEvent()、ReadFile()、WriteFile()都使用了非阻塞通信技术,依靠重叠(overlapped)读写操作,让串口读写操作在后台运行.

寻找VB.net API程序接口网站

以上就是土嘎嘎小编为大家整理的vb.net的api接口相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章