Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Abfrage Portadresse

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
15.08.2002, 11:48 Uhr
Tommix



Hallo,
ich versuche gerade ein Programm von LabWindows (ein C-Compiler von National Instruments) nach Visual C++ zu portieren. Das Programm kommuniziert mit einem Gerät über den Parallelport mit _inp() und _outp(). Die IO-Adressen sind bei LPT1 auf den meisten Rechnern 0x378 und 0x379 - aber eben nicht bei allen. Mit LabWindows kann ich - auch unter Windows - die Adresse aus dem BIOS lesen:

C++:
short int adr;
ReadFromPhysicalMemory (0x0000408, &adr, sizeof(adr));


LabWindows hat für sowas einen speziellen Treiber installiert ("Low-Level-Support"). Wie kriege ich nun die Adresse von LPT 1 mit Visual C++ sicher raus? Das muß doch irgendwo gespeichert sein! In der Registrierung habe ich nichts gefunden.

Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.08.2002, 11:46 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo Tommix,
hat etwas länger gedauert, aber kannst Du evtl. noch nutzen. Hatte nämlich ein Verständnisproblem auf den win9x Rechnern.
So: Bei NT kannst Du aus der Registry lesen, bei Win9x Rechnern geht das nicht, da nur der Verweis auf die/den Treiber existent ist.

C++:
// lpt.cpp : Definiert den Einsprungpunkt für die Konsolenanwendung.
//

#include "stdafx.h"
#include "lpt.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// Das einzige Anwendungsobjekt

CWinApp theApp;

using namespace std;
typedef BOOL (CALLBACK * PROCTYPE_Toolhelp32ReadProcessMemory)( DWORD, LPCVOID, LPVOID, DWORD ,LPDWORD);
#define WINDOWS_NT (!(GetVersion() & 0x80000000))

int GetPCKey(char *kKey) /*ParallelControllerKey*/
{
    HKEY hKey;
    char myData[255];
    LONG res;
    DWORD mySize;
    FILETIME ftLWT;

    if (NULL==kKey)
    return(-1);

    *kKey=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,&ftLWT);
        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,&ftLWT);
                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,&ftLWT);
                        if (res==ERROR_SUCCESS){
                            if (0==strcmp(myData,"ParallelController") ){
                                strcpy(kKey,myKey2);
                                strcat(kKey,"\\");
                                strcat(kKey,myData);
                                return(0);
                            }
                        }
                    }
                }
            }
        }
    }
    return(-1);
}

int GetLptPortInRegistry(int myPort) /*NT und Folgende */
{
    HKEY phkResult;
    char myKey[255];
    char myData[255];
    LONG res;
    DWORD mySize;
    DWORD myType;
    res=GetPCKey(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 );
}

int GetLptPortInMemory(int myPort) /* Win9x und ME */
{
    HINSTANCE hDLL=NULL; // Handle zur DLL
    PROCTYPE_Toolhelp32ReadProcessMemory myProcPointer=NULL;
    hDLL = LoadLibrary("kernel32");
    if (hDLL==NULL)
        return(-1);
    myProcPointer=(PROCTYPE_Toolhelp32ReadProcessMemory)GetProcAddress(hDLL,"Toolhelp32ReadProcessMemory");
    if (myProcPointer==NULL){
        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 GetAddressLptPort(int myPort)
{
    if(myPort<1)
        return(-1);
    if(myPort>3)
        return(-1);
    if (WINDOWS_NT)
        return(GetLptPortInRegistry(myPort));
    return(GetLptPortInMemory(myPort));
}


int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;

    // MFC initialisieren, Ausgabe und Fehlermeldung bei Fehlern
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    {
        // ZU ERLEDIGEN: Fehlercode gemäß Ihren Anforderungen ändern
        cerr << _T("Fatal Error: MFC initialization failed") << endl;
        nRetCode = 1;
    }
    else
    {
        printf("0x%02X",GetAddressLptPort(1)); //1-3
    
    }

    return nRetCode;
}


Auf einem Win95 konnte ich nicht testen sollte aber auch funktionieren.
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.08.2002, 17:54 Uhr
Tommix



Hallo,
vielen Dank. Es funzt unter Windows 98.

_ Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: