📄 tdlportio.cpp
字号:
}
}
// Load DLL library
AnsiString LibraryFileName = LIBRARY_FILENAME;
if (FDLLPath.Length()>0)
LibraryFileName = FDLLPath+"\\"+LIBRARY_FILENAME;
FDLLInst=LoadLibrary(LibraryFileName.c_str());
if (FDLLInst!=NULL)
{
DlReadByte=(TDlPortReadPortUchar)
GetProcAddress(FDLLInst,"DlPortReadPortUchar");
DlReadWord=(TDlPortReadPortUshort)
GetProcAddress(FDLLInst,"DlPortReadPortUshort");
DlReadDWord=(TDlPortReadPortUlong)
GetProcAddress(FDLLInst,"DlPortReadPortUlong");
DlWriteByte=(TDlPortWritePortUchar)
GetProcAddress(FDLLInst,"DlPortWritePortUchar");
DlWriteWord=(TDlPortWritePortUshort)
GetProcAddress(FDLLInst,"DlPortWritePortUshort");
DlWriteDWord=(TDlPortWritePortUlong)
GetProcAddress(FDLLInst,"DlPortWritePortUlong");
DlReadBufferByte=(TDlPortReadPortBufferUchar)
GetProcAddress(FDLLInst,"DlPortReadPortBufferUchar");
DlReadBufferWord=(TDlPortReadPortBufferUshort)
GetProcAddress(FDLLInst,"DlPortReadPortBufferUshort");
DlReadBufferDWord=(TDlPortReadPortBufferUlong)
GetProcAddress(FDLLInst,"DlPortReadPortBufferUlong");
DlWriteBufferByte=(TDlPortWritePortBufferUchar)
GetProcAddress(FDLLInst,"DlPortWritePortBufferUchar");
DlWriteBufferWord=(TDlPortWritePortBufferUshort)
GetProcAddress(FDLLInst,"DlPortWritePortBufferUshort");
DlWriteBufferDWord=(TDlPortWritePortBufferUlong)
GetProcAddress(FDLLInst,"DlPortWritePortBufferUlong");
// Make sure all our functions are there
if (DlReadByte!=NULL && DlReadWord!=NULL && DlReadDWord!=NULL &&
DlWriteByte!=NULL && DlWriteWord!=NULL && DlWriteDWord!=NULL &&
DlReadBufferByte!=NULL && DlReadBufferWord!=NULL &&
DlReadBufferDWord!=NULL && DlWriteBufferByte!=NULL &&
DlWriteBufferWord!=NULL && DlWriteBufferDWord!=NULL)
FActiveHW=true; // Success
}
// Did we fail?
if (!FActiveHW)
{
// If we're running Windows NT, stop the driver then remove it
// Forget about any return (error) values we might get...
if (FRunningWinNT)
{
DriverStop();
DriverRemove();
DisconnectSCM();
}
// Free the library
if (FDLLInst!=NULL)
{
FreeLibrary(FDLLInst);
FDLLInst=NULL;
}
}
}
//---------------------------------------------------------------------------
// CloseDriver()
// Closes the dynamically opened DLL
//---------------------------------------------------------------------------
void __fastcall TDLPortIO::CloseDriver()
{
// Don't close anything if it wasn't opened previously
if (!IsLoaded()) return;
// If we're running Windows NT, stop the driver then remove it
if (FRunningWinNT)
{
if (!DriverStop()) return;
if (!DriverRemove()) return;
DisconnectSCM();
}
// Free the library
if (FreeLibrary(FDLLInst)==0) return;
FDLLInst=NULL;
FActiveHW=false; // Success
}
//---------------------------------------------------------------------------
// PortControl()
// Reads/writes a TVicPort/TVicHW32 compatible port record array
//---------------------------------------------------------------------------
void __fastcall TDLPortIO::PortControl(TPortRec Ports[], WORD NumPorts)
{
#ifndef FAST
if (!IsLoaded()) return;
#endif
for (int Index=0; Index<NumPorts; Index++)
if (Ports[Index].fWrite)
DlWriteByte(Ports[Index].PortAddr, Ports[Index].PortData);
else
Ports[Index].PortData=DlReadByte(Ports[Index].PortAddr);
}
//---------------------------------------------------------------------------
// PortCommand()
// Reads/writes a port command array
//---------------------------------------------------------------------------
void __fastcall TDLPortIO::PortCommand(TPortCommand Ports[], WORD NumPorts)
{
#ifndef FAST
if (!IsLoaded()) return;
#endif
for (int Index=0; Index<NumPorts; Index++)
switch (Ports[Index].PortMode)
{
case tmReadByte:
Ports[Index].PortData.Byte=DlReadByte(Ports[Index].PortAddr);
break;
case tmReadWord:
Ports[Index].PortData.Word=DlReadWord(Ports[Index].PortAddr);
break;
case tmReadDWord:
Ports[Index].PortData.DWord=DlReadDWord(Ports[Index].PortAddr);
break;
case tmWriteByte:
DlWriteByte(Ports[Index].PortAddr, Ports[Index].PortData.Byte);
break;
case tmWriteWord:
DlWriteWord(Ports[Index].PortAddr, Ports[Index].PortData.Word);
break;
case tmWriteDWord:
DlWriteDWord(Ports[Index].PortAddr, Ports[Index].PortData.DWord);
break;
default:
break; // Ignore it
}
}
//*************************************************************************//
// TDLPrinterPortIO class implementation
//*************************************************************************//
//---------------------------------------------------------------------------
// TDLPrinterPortIO()
//---------------------------------------------------------------------------
__fastcall TDLPrinterPortIO::TDLPrinterPortIO(TComponent *Owner)
: TDLPortIO(Owner),
FLPTNumber(0), // No LPT selected
FLPTBase(0), // No base address
FLPTCount(0) // No printer ports counted
{
// Detect the printer ports available
DetectPorts();
// Set the default LPT number
SetLPTNumber(1);
}
//---------------------------------------------------------------------------
// DetectPorts()
//---------------------------------------------------------------------------
void __fastcall TDLPrinterPortIO::DetectPorts()
{
bool RunningWinNT;
// Are we running Windows NT?
OSVERSIONINFO os;
memset(&os, NULL, sizeof(OSVERSIONINFO));
os.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&os);
RunningWinNT=(os.dwPlatformId==VER_PLATFORM_WIN32_NT);
// Detect the printer ports available
if (RunningWinNT)
DetectPortsNT(); // WinNT version
else
DetectPorts9x(); // Win9x version
}
//---------------------------------------------------------------------------
// DetectPorts9x()
//---------------------------------------------------------------------------
void __fastcall TDLPrinterPortIO::DetectPorts9x()
{
const char *BASE_KEY = "Config Manager\\Enum";
const char *PROBLEM = "Problem";
const char *ALLOCATION = "Allocation";
const char *PORTNAME = "PortName";
const char *HARDWARE_KEY = "HardwareKey";
const REGSAM KEY_PERMISSIONS = KEY_ENUMERATE_SUB_KEYS |
KEY_QUERY_VALUE;
HKEY CurKey; // Current key when using the registry
char KeyName[MAX_PATH]; // A key name when using the registry
char **KeyList; // List of keys
DWORD KeyCount; // Count of the number of keys in KeyList
// Clear the port count
FLPTCount = 0;
// Clear the port array
for (int index=0; index<=MAX_LPT_PORTS; index++)
FLPTAddress[index] = 0;
// Open the registry
RegOpenKeyEx(HKEY_DYN_DATA, BASE_KEY, 0, KEY_PERMISSIONS, &CurKey);
// Grab all the key names under HKEY_DYN_DATA
//
// Do this by first counting the number of keys,
// then creating an array big enough to hold them
// using the KeyList pointer.
FILETIME DummyFileTime;
DWORD DummyLength = MAX_PATH;
KeyCount = 0;
while (RegEnumKeyEx(
CurKey, KeyCount++, KeyName, &DummyLength,
NULL, NULL, NULL, &DummyFileTime
) != ERROR_NO_MORE_ITEMS)
{
DummyLength = MAX_PATH;
}
KeyList = new char*[KeyCount];
KeyCount = 0;
DummyLength = MAX_PATH;
while (RegEnumKeyEx(
CurKey, KeyCount, KeyName, &DummyLength,
NULL, NULL, NULL, &DummyFileTime
) != ERROR_NO_MORE_ITEMS)
{
KeyList[KeyCount] = new char[DummyLength+1];
strcpy(KeyList[KeyCount], KeyName);
DummyLength = MAX_PATH;
KeyCount++;
}
// Close the key
RegCloseKey(CurKey);
// Cycle through all keys; looking for a string valued subkey called
// 'HardWareKey' which is not NULL, and another subkey called 'Problem'
// whose fields are all valued 0.
for (DWORD KeyIndex=0; KeyIndex<KeyCount; KeyIndex++)
{
bool HasProblem = false; // Is 'Problem' non-zero? Assume it is Ok
// Open the key
strcpy(KeyName, BASE_KEY);
strcat(KeyName, "\\");
strcat(KeyName, KeyList[KeyIndex]);
if (RegOpenKeyEx(
HKEY_DYN_DATA, KeyName, 0, KEY_PERMISSIONS, &CurKey
) != ERROR_SUCCESS)
continue;
// Test for a 0 valued Problem sub-key,
// which must only consist of raw data
DWORD DataType, DataSize;
RegQueryValueEx(CurKey, PROBLEM, NULL, &DataType, NULL, &DataSize);
if (DataType == REG_BINARY)
{
// We have a valid, binary "Problem" sub-key
// Test to see if the fields are zero
char HardwareSubKey[MAX_PATH];
// Data from the "Hardware" sub-key
BYTE *Data = new BYTE[DataSize];
// Data from "Problem" sub-key
// Read the data from the "Problem" sub-key
if (RegQueryValueEx(
CurKey, PROBLEM, NULL,
NULL, Data, &DataSize
) == ERROR_SUCCESS)
{
// See if it has any problems
for (DWORD index=0; index<DataSize; index++)
HasProblem |= Data[index];
}
else
HasProblem = true; // No good
delete[] Data;
// Now try and read the Hardware sub-key
DataSize = MAX_PATH;
RegQueryValueEx(
CurKey, HARDWARE_KEY, NULL, &DataType, HardwareSubKey, &DataSize
);
if (DataType != REG_SZ)
HasProblem = true; // No good
// Do we have no problem, and a non-null Hardware sub-key?
if (!HasProblem && strlen(HardwareSubKey) > 0)
{
// Now open the key which is "pointed at" by HardwareSubKey
RegCloseKey(CurKey);
strcpy(KeyName, "Enum\\");
strcat(KeyName, HardwareSubKey);
if (RegOpenKeyEx(
HKEY_LOCAL_MACHINE, KeyName, 0, KEY_PERMISSIONS, &CurKey
) != ERROR_SUCCESS)
continue;
// Now read in the PortName and obtain the LPT number from it
char PortName[MAX_PATH];
DataSize = MAX_PATH;
RegQueryValueEx(
CurKey, PORTNAME, NULL, &DataType, PortName, &DataSize
);
if (DataType != REG_SZ)
strcpy(PortName, ""); // No good
// Make sure it has LPT in it
if (strstr(PortName, "LPT") != NULL)
{
int PortNumber;
// The nubmer of the port
char PortNumberStr[MAX_PATH];
// Holds the number of the port as a string
WORD Allocation[64];
// Holds the registry data for the port address allocation
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -