亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

??

?? 一些匯編例子
??
字號:
//////////// 文件Parallel.h內容如下://////////////
#ifndef __PARALLEL_H__
#define __PARALLEL_H__

#include "stdio.h"
#include "conio.h"
#include "windows.h"

class   CParallel
{
// 構造/析構函數
public:
    CParallel();
    virtual         ~CParallel() {};

// 成員函數
public:
    // 打開并口函數,參數傳入設備名,如"LPT1"
    virtual LONG    Open(LPCTSTR lpszDevice);
    // 關閉并口
    virtual LONG    Close(void);

    // 打印數據
    virtual LONG    PrintString(const void* pData, size_t iLen, DWORD* pdwWritten = 0, DWORD dwTimeout = INFINITE);
    virtual LONG    PrintString(LPCSTR pString, DWORD* pdwWritten = 0, DWORD dwTimeout = INFINITE);
    LONG            PrintByte(char data);

    // 檢測并口是否已經打開
    bool IsOpen(void) const
    {
        return (m_hFile != 0 && m_hFile != INVALID_HANDLE_VALUE);
    }

    // 取出最后的錯誤代碼
    LONG GetLastError(void) const    {        return m_lLastError;    }

    void            WriteControl(int nData);
    int             ReadControl();
    void            WriteData(int nData);
    int             ReadData();
    int             ReadStatus();

protected:
    static BOOL         RunningOnNT();
    inline static void  WriteControl(unsigned short nBaseAddress, int nData);
    inline static int   ReadControl(unsigned short nBaseAddress);
    inline static void  WriteData(unsigned short nBaseAddress, int nData);
    inline static int   ReadData(unsigned short nBaseAddress);
    inline static int   ReadStatus(unsigned short nBaseAddress);

	int GetParallelControllerKey(char* parKey);
	int GetAddressLptPortInTheRegistry(int myPort);
	int GetAddressLptPortInTheMemory(int myPort);
	int GetAddressLptPort(int nPort);

// 成員變量
protected:
    LONG            m_lLastError;   // 錯誤代碼
    HANDLE         m_hFile;        // 并口設備句柄
    DWORD          m_dwTimeout;    // 讀寫超時控制(毫秒)
    unsigned short      m_nBaseAddress; // 并口的基地址
};
#endif // __PARALLEL_H__

///////////// 文件Parallel.cpp內容如下://///////////////////
#include "stdafx.h"
#include "Parallel.h"
#pragma comment(lib, "advapi32.lib")
#pragma comment(lib, "user32.lib")

CParallel::CParallel()
{
    // 初始化成員變量
    m_lLastError = ERROR_SUCCESS;
    m_hFile = NULL;
    m_nBaseAddress = 0;
    m_dwTimeout = 1000;

	// 如果是Windows NT則打開端口訪問權限
    if (RunningOnNT())
    {
        HANDLE hDriver = CreateFile("\\\\.\\giveio", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

        if (hDriver == INVALID_HANDLE_VALUE)
        {
            m_lLastError = ::GetLastError();
            return;
        }
		CloseHandle(hDriver);
        hDriver = NULL;
    }
}

LONG CParallel::Open(LPCTSTR lpszDevice)
{
    m_lLastError = ERROR_SUCCESS;

    // 檢查并口是否已經打開
    if (m_hFile)
    {
        m_lLastError = ERROR_ALREADY_INITIALIZED;
        return m_lLastError;
    }

    // 取得并口的基地址
    if (!stricmp(lpszDevice, "LPT1"))
        m_nBaseAddress = GetAddressLptPort(1);
    else if (!stricmp(lpszDevice, "LPT2"))
        m_nBaseAddress = GetAddressLptPort(2);
    else if (!stricmp(lpszDevice, "LPT3"))
        m_nBaseAddress = GetAddressLptPort(3);
    else
    {
        m_lLastError = ERROR_FILE_NOT_FOUND;
        return m_lLastError;
    }

    // 調用CreateFile 函數打開并口設備,防止其他設備在我們直接操作端口時打開并口
    m_hFile = CreateFile(lpszDevice, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
    if (m_hFile == INVALID_HANDLE_VALUE)
    {
        m_hFile = 0;
        m_lLastError = ::GetLastError();
        return m_lLastError;
    }

    return m_lLastError;
}

LONG CParallel::Close()
{
    m_lLastError = ERROR_SUCCESS;

    if (m_hFile == 0)
        return m_lLastError;

    // 關閉并口設備句柄
    ::CloseHandle(m_hFile);
    m_hFile = 0;
    m_nBaseAddress = 0;

    return m_lLastError;
}

void CParallel::WriteControl(unsigned short nBaseAddress, int nData)
{
    // 控制寄存器偏移量為 nBaseAddress + 2.
    // 第 0, 1 & 3 位必須取反
    _outp((unsigned short)(nBaseAddress + 2), nData ^ 0xB);
}

int CParallel::ReadControl(unsigned short nBaseAddress)
{
    // 控制寄存器偏移量為 nBaseAddress + 2.
    // 第 0, 1 & 3 位必須取反
    return (_inp((unsigned short)(nBaseAddress + 2)) ^ 0xB);
}

void CParallel::WriteData(unsigned short nBaseAddress, int nData)
{
    // 數據寄存器的偏移量即是 nBaseAddress.
    _outp(nBaseAddress, nData);
}

int CParallel::ReadData(unsigned short nBaseAddress)
{
    // 數據寄存器的偏移量即是 nBaseAddress.
    return _inp(nBaseAddress);
}

int CParallel::ReadStatus(unsigned short nBaseAddress)
{
    // 狀態寄存器偏移量為 nBaseAddress + 1.
    // 第 7 位必須取反
    return (_inp((unsigned short)(nBaseAddress + 1)) ^ 0x80);
}

void CParallel::WriteControl(int nData)
{
    WriteControl(m_nBaseAddress, nData);
}

int CParallel::ReadControl()
{
    return ReadControl(m_nBaseAddress);
}

void CParallel::WriteData(int nData)
{
    WriteData(m_nBaseAddress, nData);
}

int CParallel::ReadData()
{
    return ReadData(m_nBaseAddress);
}

int CParallel::ReadStatus()
{
    return ReadStatus(m_nBaseAddress);
}

LONG CParallel::PrintString(const void* pData, size_t iLen, DWORD* pdwWritten /*= 0*/, DWORD dwTimeout /*= INFINITE*/ )
{
    DWORD   dwStartTicks = GetTickCount();
    for (unsigned int i = 0; i < iLen; i++)
    {
        // 檢查是否超時
        if ((GetTickCount() - dwStartTicks) > m_dwTimeout)
        {
            m_lLastError = ERROR_TIMEOUT;
            return m_lLastError;
        }

        m_lLastError = PrintByte(((unsigned char*)pData)[i]);
		
		if (ERROR_SUCCESS != m_lLastError) 
			return m_lLastError;

        if (pdwWritten != NULL)
            *pdwWritten = i + 1;
    }

    m_lLastError = ERROR_SUCCESS;
    return m_lLastError;
}

LONG CParallel::PrintString(LPCSTR pString, DWORD* pdwWritten /*= 0*/, DWORD dwTimeout /*= INFINITE*/ )
{
    return PrintString(pString, strlen(pString), pdwWritten, dwTimeout);
}

LONG CParallel::PrintByte(char data)
{
    // 檢測設備是否已經打開
    if (m_hFile == 0)
    {
        m_lLastError = ERROR_INVALID_HANDLE;
        return m_lLastError;
    }

	// 檢測BUSY線是否忙,忙則等待
    int     S7;
    DWORD   dwStartTicks = GetTickCount();
    do
    {
        S7 = (ReadStatus() & 0x80) >> 7;

        if ((GetTickCount() - dwStartTicks) > m_dwTimeout)
        {
            m_lLastError = ERROR_TIMEOUT;
            return m_lLastError;
        }
    } while (S7 == 0x1);

	// 發數據 
    WriteData(data);

	// 置數據發送完畢Strobe線
    int C0 = ReadControl();
    C0 &= 0xfe;
    WriteControl(C0);
    for (int i = 0; i < 1000; i++)
        ;
    C0 |= 0x01;
    WriteControl(C0);

    // 檢測ACK線
    int S6;
    do
    {
        S6 = (ReadStatus() & 0x40) >> 6;

        if ((GetTickCount() - dwStartTicks) > m_dwTimeout)
        {
            m_lLastError = ERROR_TIMEOUT;
            return m_lLastError;
        }
    } while (S6 == 0);

    m_lLastError = ERROR_SUCCESS;
    return m_lLastError;
}

BOOL CParallel::RunningOnNT()
{
    OSVERSIONINFO   osvi;
    memset(&osvi, 0, sizeof(OSVERSIONINFO));
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    GetVersionEx(&osvi);
    return (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT);
}

// 以下代碼用于獲取并口的基地址
int CParallel::GetParallelControllerKey(char* parKey)
{
    HKEY        hKey;
    char        myData[255];
    LONG        res;
    DWORD       mySize;
    FILETIME    ftLastWriteTime;

    if (NULL == parKey)
        return (-1);
    *parKey = 0;

    char    myKey[255];
    sprintf(myKey, "HARDWARE\\DESCRIPTION\\System");
    res = RegOpenKeyEx(HKEY_LOCAL_MACHINE, myKey, 0, KEY_READ, &hKey);
    if (res != ERROR_SUCCESS)
        return (-1);

    DWORD   dwIndex1;
    char    myKey1[255];
    for (dwIndex1 = 0; dwIndex1 <= 10; dwIndex1++)
    {
        mySize = sizeof(myData);
        res = RegEnumKeyEx(hKey, dwIndex1, myData, &mySize, NULL, NULL, NULL, &ftLastWriteTime);

        if (res == ERROR_SUCCESS)
        {
            strcpy(myKey1, myKey);
            strcat(myKey1, "\\");
            strcat(myKey1, myData);

            HKEY    hKey1;
            res = RegOpenKeyEx(HKEY_LOCAL_MACHINE, myKey1, 0, KEY_READ, &hKey1);
            if (res != ERROR_SUCCESS)
                return (-1);

            DWORD   dwIndex2;
            char    myKey2[255];
            for (dwIndex2 = 0; dwIndex2 <= 10; dwIndex2++)
            {
                mySize = sizeof(myData);
                res = RegEnumKeyEx(hKey1, dwIndex2, myData, &mySize, NULL, NULL, NULL, &ftLastWriteTime);
                if (res == ERROR_SUCCESS) 
                {
                    strcpy(myKey2, myKey1);
                    strcat(myKey2, "\\");
                    strcat(myKey2, myData);

                    HKEY    hKey2;
                    res = RegOpenKeyEx(HKEY_LOCAL_MACHINE, myKey2, 0, KEY_READ, &hKey2);
                    if (res != ERROR_SUCCESS)
                        return (-1);

                    DWORD   dwIndex3;
                    for (dwIndex3 = 0; dwIndex3 <= 10; dwIndex3++)
                    {
                        mySize = sizeof(myData);
                        res = RegEnumKeyEx(hKey2, dwIndex3, myData, &mySize, NULL, NULL, NULL, &ftLastWriteTime);

                        if (res == ERROR_SUCCESS)
                        {
                            if (0 == strcmp(myData, "ParallelController"))
                            {
                                strcpy(parKey, myKey2);

                                strcat(parKey, "\\");

                                strcat(parKey, myData);
                                return (0);
                            }
                        } 
                    }
                }
            }
        }
    }
    return (-1);
}

int CParallel::GetAddressLptPortInTheRegistry(int myPort)
{
    HKEY    phkResult;
    char    myKey[255];
    char    myData[255];
    LONG    res;
    DWORD   mySize;
    DWORD   myType;

    res = GetParallelControllerKey(myKey);
    if (res < 0)
        return (-1);

    sprintf(myData, "%s\\%d", myKey, myPort - 1);

    res = RegOpenKeyEx(HKEY_LOCAL_MACHINE, myData, 0, KEY_READ, &phkResult);
    if (res != ERROR_SUCCESS)
        return (-1);

    mySize = sizeof(myData);
    myType = REG_BINARY;

    res = RegQueryValueEx(phkResult, "Configuration Data", NULL, &myType, 
			(unsigned char*)myData, &mySize);
    if (res != ERROR_SUCCESS)
        return (-1);

    return (myData[0x14] | myData[0x15] << 8);
}

typedef BOOL (CALLBACK *PROCTYPE_Toolhelp32ReadProcessMemory) (DWORD, LPCVOID, LPVOID, DWORD, LPDWORD);

int CParallel::GetAddressLptPortInTheMemory(int myPort)
{
    HINSTANCE   hDLL = NULL;    // Handle to DLL
    PROCTYPE_Toolhelp32ReadProcessMemory    myProcPointer = NULL;

    hDLL = LoadLibrary("kernel32");
    if (hDLL == NULL)
        return (-1);

    myProcPointer = (PROCTYPE_Toolhelp32ReadProcessMemory) GetProcAddress(hDLL, "Toolhelp32ReadProcessMemory");
    if (myProcPointer == NULL)  /*handle the error*/
    {
        FreeLibrary(hDLL);
        return -1;
    }

    int     portAddresses[] = { 0, 0, 0, 0, 0 };
    BOOL    rtn = 0;
    DWORD   cbLen = 0;

    rtn = myProcPointer(0, (LPCVOID*)0x408, portAddresses, 8, NULL);

    FreeLibrary(hDLL);

    if (rtn == 0)
        return (-1);

    if (portAddresses[myPort - 1] <= 0)
        return (-1);

    if (portAddresses[myPort - 1] >= 0x1000)
        return (-1);

    return (portAddresses[myPort - 1]);
}

int CParallel::GetAddressLptPort(int nPort)
{
	if ((nPort < 1) || (nPort > 3))
		return (-1);

	if (RunningOnNT())
		return (GetAddressLptPortInTheRegistry(nPort));

	return (GetAddressLptPortInTheMemory(nPort));
}

/////////// test.cpp內容如下://////////////////////

#include "parallel.h"

void main()
{
	CParallel port;
	port.Open("LPT1");
	if (port.IsOpen())
	{
		port.PrintString("abc\n");
		port.Close();
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91视频在线观看免费| 午夜精品aaa| 亚洲国产精品成人综合色在线婷婷 | 9人人澡人人爽人人精品| 色狠狠桃花综合| 欧美精选午夜久久久乱码6080| 欧美一区二区视频在线观看| 国产日产精品1区| 日韩电影免费在线观看网站| 国产成人av一区二区三区在线观看| 色综合天天综合狠狠| 欧美不卡一区二区三区| 中文字幕一区二区不卡| 青青草原综合久久大伊人精品优势| 成人黄页毛片网站| 日韩亚洲电影在线| 亚洲综合一二区| 东方aⅴ免费观看久久av| 日韩一区在线看| 色婷婷精品久久二区二区蜜臀av | 亚洲电影你懂得| 福利电影一区二区| 亚洲欧美aⅴ...| 国产一区二区调教| 欧美视频一区二区在线观看| 国产精品麻豆欧美日韩ww| 精品系列免费在线观看| 欧美性色黄大片| 激情小说亚洲一区| 精品国产一区二区在线观看| 日韩精品亚洲一区| 欧美日韩成人综合在线一区二区| 国产精品国产三级国产aⅴ入口 | 国产精品视频一二三区| 欧美羞羞免费网站| 精品一区二区免费视频| 亚洲欧洲精品天堂一级| 日韩限制级电影在线观看| 成人高清免费在线播放| 日韩av一区二区三区四区| 中国av一区二区三区| 欧美日韩卡一卡二| 成人免费视频免费观看| 中文字幕成人av| 欧美日韩mp4| 成人国产亚洲欧美成人综合网| 午夜精品影院在线观看| 国产精品久久久久久久岛一牛影视 | 色综合天天性综合| 久久国产精品99久久久久久老狼| 日韩视频一区二区在线观看| 99精品视频一区二区三区| 亚洲丝袜制服诱惑| 欧美午夜在线观看| 高清不卡在线观看av| 亚洲第一久久影院| 国产精品久久久久7777按摩| 精品国产一区二区三区四区四| 欧美影院午夜播放| eeuss鲁片一区二区三区 | 最新国产の精品合集bt伙计| 欧美一二三四在线| 欧美精选午夜久久久乱码6080| 91污在线观看| 成人av网站在线观看免费| 精品一区二区三区视频在线观看| 亚洲一本大道在线| 26uuu国产电影一区二区| 国产高清成人在线| 麻豆精品新av中文字幕| 国产农村妇女毛片精品久久麻豆 | 日韩三区在线观看| 欧美色国产精品| 精品综合免费视频观看| 日韩不卡一区二区三区| 日韩激情av在线| 三级欧美在线一区| 亚洲图片欧美视频| 亚洲激情图片一区| 久久精品欧美日韩精品| 日本道色综合久久| 99re这里都是精品| 91性感美女视频| 色婷婷精品久久二区二区蜜臂av | 亚洲欧美日韩在线| 亚洲欧洲精品天堂一级| 亚洲欧美激情插| 亚洲欧美激情在线| 亚洲综合自拍偷拍| 国产色91在线| 中文无字幕一区二区三区| 国产欧美一区二区在线| 中文字幕的久久| 亚洲免费毛片网站| 亚洲国产欧美在线| 天涯成人国产亚洲精品一区av| 图片区小说区区亚洲影院| 三级欧美韩日大片在线看| 奇米777欧美一区二区| 免费成人av在线播放| 激情综合网最新| 丁香天五香天堂综合| 91视频你懂的| 欧美美女黄视频| 精品日韩在线观看| 国产精品你懂的在线欣赏| 亚洲免费在线播放| 免费高清不卡av| 国产精品99久久久| 久久国产精品免费| 成人永久看片免费视频天堂| 91免费观看在线| 在线不卡中文字幕| 久久九九国产精品| 亚洲乱码国产乱码精品精小说| 亚洲一区二区三区爽爽爽爽爽| 日本亚洲视频在线| 国产不卡视频一区| 91高清在线观看| 久久伊99综合婷婷久久伊| 一区在线观看视频| 男男视频亚洲欧美| 不卡一卡二卡三乱码免费网站| 欧美少妇bbb| 久久久久高清精品| 久久久久久99精品| 亚洲综合在线免费观看| 精品一区二区三区欧美| 在线视频一区二区三区| 欧美性videosxxxxx| 久久久av毛片精品| 亚洲成av人综合在线观看| 国产99一区视频免费| 欧美精品成人一区二区三区四区| 久久久99精品免费观看| 日韩精品一级中文字幕精品视频免费观看| 国产精品亚洲专一区二区三区 | heyzo一本久久综合| 日韩久久精品一区| 日韩精品中文字幕一区二区三区 | 美女视频黄 久久| 97久久超碰精品国产| 精品欧美一区二区在线观看 | 视频一区中文字幕| 成年人国产精品| 婷婷夜色潮精品综合在线| 国产黄色成人av| 日韩欧美不卡在线观看视频| 亚洲一区二区三区在线看| 国产ts人妖一区二区| 日韩欧美国产高清| 亚洲成a人v欧美综合天堂下载| 99国产一区二区三精品乱码| 久久久久久久久伊人| 日本欧美一区二区三区| 欧美日韩一区高清| 亚洲精品高清在线观看| av在线一区二区三区| 国产视频一区二区三区在线观看 | 精品久久久久av影院| 午夜不卡av免费| 欧美午夜在线一二页| 亚洲乱码国产乱码精品精小说| 不卡的av中国片| 亚洲国产精品精华液ab| 国产精品一区二区久久不卡 | 成人性视频免费网站| www国产精品av| 蜜臀av性久久久久蜜臀aⅴ流畅| 欧美在线free| 亚洲最新视频在线观看| 欧美亚洲一区二区三区四区| 日韩毛片视频在线看| 一本大道av伊人久久综合| 综合av第一页| 95精品视频在线| 亚洲日本丝袜连裤袜办公室| 波多野结衣中文字幕一区二区三区| 国产日韩欧美精品电影三级在线| 久草精品在线观看| 精品对白一区国产伦| 久久国产免费看| 久久综合久久久久88| 国产精品亚洲午夜一区二区三区 | 国内成+人亚洲+欧美+综合在线| 日韩一级免费一区| 久久99精品一区二区三区| 2020国产精品久久精品美国| 在线成人av网站| 美女视频第一区二区三区免费观看网站| 91精品国产一区二区| 免费一级欧美片在线观看| 日韩免费视频一区| 国产精品一区二区果冻传媒| 亚洲国产岛国毛片在线| www.在线成人| 亚洲午夜电影在线观看| 欧美一区二区国产| 国产91丝袜在线播放九色| 亚洲视频一区二区在线观看|