能否在Windows2000/XP下直接端口操作?(200分)

  • 主题发起人 主题发起人 叮叮当当
  • 开始时间 开始时间

叮叮当当

Unregistered / Unconfirmed
GUEST, unregistred user!
嵌入汇编方式直接对端口进行读写操作,在Windows2000/XP里会引起非法操作(特权指令),
请问有没有办法可以简单地解决?(不需要写VXD的那种)。
是由于要和单片机试验多机通讯方式,而要使串口在无奇偶校验设置下发出奇偶校验位,
因此要读写3FBH端口。
 
你可以在Windows2000/xp下可以通过编写微机端口读写函数的32位动态链接库(DLL),来
达到读写输入输出口的目的,这样就可以不需要写VXD了

与WIN16的DLL编写规则不同,WIN32的DLL中不再需要入口函数LibMain、出口函数WEP,
代替二者的是DllMain函数。DllMain既是人口函数,又是出口函数。由于Windows 95、
Windows NT支持多进程、多线程,故32位的DLL也支持多进程、多线程。当在一进程或
线程中调用DLL时,DllMain就被调用;同样,当线程或进程结束时,DllMain也被调用。
如在DLL无特别声明,DLL的数据归调用进程中所有线程共有,也就是说,这一进程中所
有线程都可访问这些数据。这一特性给我们编写端口读写函数的DLL带来了方便。因为
一般来说,我们的应用程序属于一个进程,并且端口读写函数不涉及到数据共享,即在
我们的DLL不需要自已编写DllMain。

另外,Visual C++ for WIN32中不再识别位于函数头部的_export关键字,但识别
另一个属性名dllexport。通过使用dllexport属性,可以不用在DLL的.DEF文件中使用
EXPORT语法,就可输出函数。由于dllexport是属性,不是关键字,所以必须这样使
用:将_declspec(dllexport)放在想要输出的函数头部。同样,若要在Visual C++的
应用程序中调用DLL中的输出函数,则可在输入的函数头部用属性dllimport,
即:_deslspec(dllimport)。

你也可以用其它的语言来实现,但方法都差不多。

 
可否给个Delphi写的例程?非常感谢!
 
呵呵,不好意思,DELPHI我刚学没多久,对它还不是很了解,但是可以用
vc++给你写一个,不知可不可以,你可以参考一下,我也帮你想想。

其实在32位VC++应用程序中使用MyPort动态链接库更简单。只要在应用
程序中包含MyPort.h文件,再在应用程序的工程中加入MyPort.lib文件,即
可生成调用MyPort动态链接库的可执行文件。同样,也需将MyPort.dll放在
Windows/system目录下。

……

#include ″MyPort.h″

……

MyOutput(0x2e0,0xf);

LONG lValue=MyInput(0x2e0);

……

怎么样,很简单吧,你要不用vc++写这个DLL得了
 
MyPort.dll是哪里来的?是自己写的么?
如果是自己写的,那实现MyOutput和MyInput的代码是什么?
难道在DLL动态链接库里进行端口读写操作就没有问题了么?不会的吧?
如果MyPort.dll是已经现成的别人写好的,那请给个下载地址和调用参数。
谢谢!
 
MyPort.dll是vc++自己生成的。
其实dll比vxd有优势,按Windows的即插即用(P&P)的规范,则要为测控系统开
发特制的微机扩展插板,还要编写相应的驱动程序。这样不仅原来的扩展
插板需改电路,同时还要开发与Windows接口的驱动程序,而对端口读写用dll实现简单
的多。我就把所有的原代码写给你好了,
在VC6.0中选择File|New,在New对话框中选择Project WorkSpace,再
在New Project WorkSpace对话框中选择Dynamic-Link Library选项,并输入工程项目
名(project name),即可生成动态链接库
的工程框架。在下面的程序中使用工程项目名MyPort。将MyPort.cpp加入过程中,再
按F7键,即可生成MyPort.dll及MyPort.lib文件。

//MyPort.h……定义DLL中输出函数原型,也可包含在调用DLL的应用程序中

#ifndef _MYPORT_H_

#define _MYPORT_H_

#include 〈windows.h〉

#include ″defdll.h″

extern ″C″ //使编译程序不对下面括号中的函数名加修饰,可将输出函数用于
非C++程序

{

INTERFACE LONG MyInput(LONG lAdress);

INTERFACE LONG MyOutput(LONG lAdress,LONG lCommand);

}

#endif

//defdll.h……定义用于输出、输入函数的宏INTERFACE

#ifdef DEFDLL

#define INTERFACE _declspec(dllexport)

#else

#define INTERFACE _declspec(dllimport)

#endif

//MyPort.cpp……定义DLL中的输出函数

#include 〈conio.h〉

#define DEFDLL

#include ″MyPort.h″

INTERFACE LONG MyInput(LONG lAdress)

{

return(LONG)_inp((WORD)lAdress);

}

INTERFACE LONG MyOutput(LONG lAdress,LONG lCommand)

{

_outp((WORD)lAdress,(BYTE)lCommand);

return lCommand;

}

在以上的程序MyPort.cpp中定义了DEFDLL,则defdll.h中的宏INTERFACE展开
成_declspec(dllexport),可用于函数的输出,正如上所述,也不用再在DLL的.DEF中加
输出语句。当在调用此DLL的应用程序中包含MyPort.h时,由于没有定义DEFDLL,则
宏INTERFACE展开成-declspec(dllimport),可用于输入函数。

哎,总算写好了,我编译了一下,没有什么问题,你看看吧(呜~~,钱真难赚阿,谁叫
咱是穷人咧)
 
真的非常感谢!但是我没有VC++6.0,只有VS.Net,而且既然你已经编译出了dll文件,
可否马上Email给我?我试后如果能用马上就给分结束问题。
 
地址呢?
呵呵,其是分不重要,看来你对delphi还是不错的,我可是delphi新手,教个朋友如何
,我的qq是4616506。
 
我并不关心VC++是如何生成DLL和进行动态链接库编程的,我想了解的只是为什么
用Delphi内嵌汇编进行端口操作(诸如OUT DX,AL)不行,而在VC里用_outp函数
就可以?_outp函数最终肯定也要通过OUT指令来进行端口输出,就不会引起
Windows2000/XP的拦截?因此我想再次确认一下:你是否在Windows2000/XP下试验
通过?(MyInput和MyOutput函数)不要仅仅是编译啊,要对其进行调用运行成功,
比如往3FBH端口写一个字节0BH。
我的Email:pschen@21cn.com
 
我的MSN:pschen@21cn.com,QQ:990080
 
你以为我是超人阿,老实说,我没有试验,我只是提供一个理论的模型给你罢了,并不
涉及具体的问题。
 
唉,看来不行了,其实我也写过读写端口的动态链接库,当时是用C++ Builder写的,
用Delphi写也很简单。关键是这种直接端口操作的程序在Windows2000/XP下根本不能
工作(对端口的读写将被系统拦截)。运行在RING3的应用程序都没有这个特权,只有
运行在RING0级别的才可以。因此微软说解决的办法是写VXD,VXD是运行在RING0级,
对系统资源有完全的控制能力。可是,众所周知VXD是很难的。。。
虽然问题没有解决,不过我还是很感激你做的努力!很高兴交你这个朋友!
 
Win2000下是sys文件。不写驱动应该是不行的。
 
帮我看一下这个问题,如何?

http://www.delphibbs.com/delphibbs/dispq.asp?lid=1036269
 
win2K下VxD不可用,好像我见过有人帮做好的读写控件,可惜不记得在哪里找了。
另外:Delphi工作于ring3不能调用ring0 的指令
并且delphi不能编译VxD,因为VxD是微软的专利,Borland不能用。
我知道的就这些而已。good lunk
 
To: 晨晨
能帮忙找一下做好的读写控件么?非常期待![:)]
 
我已经说过不记得哪里去找了。
不过今天早上依然去找了一下,还是没有发现,
我记得哪个控件是外国人写的。好像!
您可以去问问其他人。。。说不定我的记忆有错![:(]
good luck
 
用SPCOMM可以操作端口。有问题问我。给我分吧
 
我也很想知道,不知道能不能从这里得到答案,看来我能省分了[:D]
 

Similar threads

S
回复
0
查看
832
SUNSTONE的Delphi笔记
S
S
回复
0
查看
790
SUNSTONE的Delphi笔记
S
后退
顶部