24小时热门版块排行榜    

CyRhmU.jpeg
查看: 2214  |  回复: 15
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

leafmavis

木虫 (文坛精英)

[求助] VC++中如何应用porttalk

有个实验,是控制一个电动台做旋转运动(这部分VC++源代码由产品的制造商提供),从而给实验动物刺激,同时采集动物的脑电。我们想在旋转运动的开始和结束的时候,分别给并口一秒钟的高电平,以便在脑电信号采集系统上打上同步标记。我们做了一个并口的流水灯以验证并口操作的可靠性。用C++bulider 6.0时,利用PortTalk能控制流水灯工作;但用VC++ 6.0时,报错。因电动台的源码是VC++ 6.0,所以想请教高手。谢谢!
     下面是单纯的并口操作验证:
1、用C++bulider时,在工程目录下拷进这两个文件:PortTalk.sys; PortTalk.h。在Form中添加一个按键(功能为:使并口输出脉宽为1秒的高电平),并在Form中添加了并口初始化(因为计算机开机时并口各数据位是高电平,初始化就是将所有数据位置低)。程序运行正常,流水灯的开闭正常。

2、用VC++时,操作同上,但编译时报错。想请问一下,在VC++下如何使用PortTalk ?网上没说PortTalk不能用于VC++呀

--------------------Configuration: fang1 - Win32 Debug--------------------
Compiling resources...
Compiling...
StdAfx.cpp
Compiling...
fang1.cpp
fang1Dlg.cpp
e:\work\vc\learn1\fang1\porttalk.h(41) : error C2065: 'ShowMessage' : undeclared identifier
e:\work\vc\learn1\fang1\porttalk.h(80) : error C2065: 'SC_HANDLE' : undeclared identifier
e:\work\vc\learn1\fang1\porttalk.h(80) : error C2146: syntax error : missing ';' before identifier 'SchSCManager'
e:\work\vc\learn1\fang1\porttalk.h(80) : error C2065: 'SchSCManager' : undeclared identifier
e:\work\vc\learn1\fang1\porttalk.h(81) : error C2146: syntax error : missing ';' before identifier 'schService'
e:\work\vc\learn1\fang1\porttalk.h(81) : error C2065: 'schService' : undeclared identifier
e:\work\vc\learn1\fang1\porttalk.h(85) : error C2065: 'OpenSCManager' : undeclared identifier
e:\work\vc\learn1\fang1\porttalk.h(85) : error C2065: 'SC_MANAGER_ALL_ACCESS' : undeclared identifier
e:\work\vc\learn1\fang1\porttalk.h(94) : error C2065: 'OpenService' : undeclared identifier
e:\work\vc\learn1\fang1\porttalk.h(94) : error C2065: 'SERVICE_ALL_ACCESS' : undeclared identifier
e:\work\vc\learn1\fang1\porttalk.h(110) : error C2065: 'StartService' : undeclared identifier
e:\work\vc\learn1\fang1\porttalk.h(112) : error C2065: 'CloseServiceHandle' : undeclared identifier
e:\work\vc\learn1\fang1\porttalk.h(118) : error C2146: syntax error : missing ';' before identifier 'SchSCManager'
e:\work\vc\learn1\fang1\porttalk.h(119) : error C2146: syntax error : missing ';' before identifier 'schService'
e:\work\vc\learn1\fang1\porttalk.h(129) : error C2065: 'CreateService' : undeclared identifier
Generating Code...
Error executing cl.exe.

fang1.exe - 15 error(s), 0 warning(s)
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

春如杯中水
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)

【答案】应助回帖

★ ★
余泽成(金币+2): 谢谢参与应助! 2011-05-04 22:52:12
leafmavis(金币+7): 谢谢热情相助,VS2010下编译通过的h文件,用C++6.0还有14个错误,我再仔细研究下,谢谢! 2011-05-05 09:12:29
界面的部分都没有问题(话说这么简单的东西直接用console application不好嘛)

于是楼主能不能贴一下PortTalk.h这个文件的内容呢?

看样子像是把函数定义放到.h文件里面了(不是类模板等特殊情况的话这么做其实不好的),恩,所以先看看吧

PS:
贴代码的时候,放到
CODE:
这个里面

会比较好看一点
4楼2011-05-04 10:27:47
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)

【答案】应助回帖

★ ★
余泽成(金币+2): 辛苦了! 2011-05-04 22:54:12
不保证能用,把下面的代码贴到PortTalk.h里面的#include 那行的下面
CODE:
#include
#include

#ifdef _MFC_VER
#define ShowMessage MessageBox
#else
#define ShowMessage printf
#endif

你再编译看看有什么错误,大家再讨论~


【评论】

porttalk这个.h库写得很不好

如果在两个不同的.c/.cpp文件里面include的话,作为一个工程,会有重定义error的

不过先就这么地吧,等楼主以后熟悉编程之后,自己写都不是问题
8楼2011-05-04 14:56:34
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)

【答案】应助回帖

★ ★
余泽成(金币+2): 谢谢参与应助! 2011-05-04 22:55:03
下面的porttalk.h在VS2010下编译通过,然后运行没验证~
CODE:
#ifndef _PORTTALK_H_
#define _PORTTALK_H_

#include
#include

#ifdef _MSC_VER
static void ShowMessage(LPCTSTR str){
        MessageBox(NULL, str, NULL, 0);
}
#endif

//---------------------------------------------------------------------------

//32768-65535 are reserved for customers
#define PORTTALK_TYPE                       40000

// The IOCTRL function codes from 0x800 to 0xFFF are for customer use
#define IOCTL_IOPM_RESTRICT_ALL_ACCESS      CTL_CODE(PORTTALK_TYPE, 0x900, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_IOPM_ALLOW_EXCUSIVE_ACCESS    CTL_CODE(PORTTALK_TYPE, 0x901, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_SET_IOPM                      CTL_CODE(PORTTALK_TYPE, 0x902, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_ENABLE_IOPM_ON_PROCESSID      CTL_CODE(PORTTALK_TYPE, 0x903, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_READ_PORT_UCHAR               CTL_CODE(PORTTALK_TYPE, 0x904, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_WRITE_PORT_UCHAR              CTL_CODE(PORTTALK_TYPE, 0x905, METHOD_BUFFERED, FILE_ANY_ACCESS)

//---------------------------------------------------------------------------
bool OpenPortTalk(void);
void ClosePortTalk(void);
void outportb(unsigned short int PortAddress, unsigned char byte);
unsigned char inportb(unsigned short int PortAddress);
bool InstallPortTalkDriver(void);
bool StartPortTalkDriver(void);

//---------------------------------------------------------------------------
HANDLE PortTalk_Handle;         //Handle for PortTalk Driver

void outportb(unsigned short int PortAddress, unsigned char byte)
{
    unsigned int error;
    DWORD BytesReturned;
    unsigned char Buffer[3];
    unsigned short * pBuffer;
    pBuffer = (unsigned short *)&Buffer[0];
    *pBuffer = PortAddress;
    Buffer[2] = byte;

    error = DeviceIoControl(PortTalk_Handle,IOCTL_WRITE_PORT_UCHAR,&Buffer,3,NULL,0,&BytesReturned,NULL);
    if(!error)
        ShowMessage("Error occured during outportb while talking to PortTalk driver");
}

unsigned char inportb(unsigned short int PortAddress)
{
    unsigned int error;
    DWORD BytesReturned;
    unsigned char Buffer[3];
    unsigned short * pBuffer;
    pBuffer = (unsigned short *)&Buffer;
    *pBuffer = PortAddress;

    error = DeviceIoControl(PortTalk_Handle,IOCTL_READ_PORT_UCHAR,&Buffer,2,&Buffer,1,&BytesReturned,NULL);
    if(!error)
        ShowMessage("Error occured during inportb while talking to PortTalk driver");

    return(Buffer[0]);
}

bool OpenPortTalk(void)
{
    PortTalk_Handle = CreateFile("\\\\.\\PortTalk",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    if(PortTalk_Handle == INVALID_HANDLE_VALUE)
    {
        StartPortTalkDriver();
        PortTalk_Handle = CreateFile("\\\\.\\PortTalk",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
        if(PortTalk_Handle == INVALID_HANDLE_VALUE)
            return false;
    }
    return true;
}

void ClosePortTalk(void)
{
    CloseHandle(PortTalk_Handle);
}

bool StartPortTalkDriver(void)
{
    SC_HANDLE  SchSCManager;
    SC_HANDLE  schService;
    BOOL       ret;
    DWORD      err;

    SchSCManager = OpenSCManager (NULL,NULL,SC_MANAGER_ALL_ACCESS);
    if(SchSCManager == NULL)
    {
        if(GetLastError() == ERROR_ACCESS_DENIED)
            ShowMessage("安装驱动PortTalk.sys,需要管理员的权限!");
        return false;
    }

    do{
        schService = OpenService(SchSCManager,"PortTalk",SERVICE_ALL_ACCESS);
        if (schService == NULL)
        {
            switch(GetLastError())
            {
                case ERROR_ACCESS_DENIED:
                    return false;
                case ERROR_INVALID_NAME:
                    return false;
                case ERROR_SERVICE_DOES_NOT_EXIST:
                     InstallPortTalkDriver();
                     break;
            }
        }
    }while (schService == NULL);

    ret = StartService(schService,0,NULL);
    if(ret == NULL)    return false;
    CloseServiceHandle (schService);
    return true;
}

bool InstallPortTalkDriver(void)
{
    SC_HANDLE  SchSCManager;
    SC_HANDLE  schService;
    DWORD      err;
    CHAR       DriverFileName[80];

    GetSystemDirectory(DriverFileName, 55);
    lstrcat(DriverFileName,"\\Drivers\\PortTalk.sys");

    if(!CopyFile("PortTalk.sys", DriverFileName, FALSE))
        return false;
    SchSCManager = OpenSCManager (NULL,NULL,SC_MANAGER_ALL_ACCESS);
    schService = CreateService (SchSCManager,"PortTalk","PortTalk",SERVICE_ALL_ACCESS,SERVICE_KERNEL_DRIVER,SERVICE_DEMAND_START,SERVICE_ERROR_NORMAL,"System32\\Drivers\\PortTalk.sys",NULL,NULL,NULL,NULL,NULL);

    if(schService == NULL)
        return false;
    CloseServiceHandle (schService);
    return true;
}
//---------------------------------------------------------------------------
#endif

10楼2011-05-04 21:20:31
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)

看来我把MessageBox的参数都忘记了,咳咳...
11楼2011-05-04 21:21:27
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)

【答案】应助回帖

★ ★
微尘、梦想(金币+2): 谢谢参与应助! 2011-05-07 21:37:20
引用回帖:
Originally posted by leafmavis at 2011-05-07 12:02:22:
用你编的头文件,现在的情况如下。请继续帮忙看下,谢谢

<e:\work\vc\learn1\fang1\porttalk.h(88) : error C2065: 'SC_HANDLE' : undeclared identifier
e:\work\vc\learn1\fang1\porttalk.h(88) : er ...

再在我编的porttalk.h中,#include 的下面,加入

#include

看看?这个头文件在VS2010里面被windows.h自动包含了,不知道VC6下面是不是也这样...所以先加上试试看吧...
13楼2011-05-07 12:57:20
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)

引用回帖:
Originally posted by leafmavis at 2011-05-07 14:06:17:
只有两个了


--------------------Configuration: fang1 - Win32 Debug--------------------
Compiling...
fang1Dlg.cpp
e:\work\vc\learn1\fang1\porttalk.h(92) : warning C4101: 'err' : unrefere ...

已经可以执行fang1.exe看看什么效果了...

那两个warning不是太重要
15楼2011-05-07 16:16:18
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 leafmavis 的主题更新
信息提示
请填处理意见