Avatar billede apocryphal Nybegynder
08. oktober 2002 - 13:18 Der er 3 kommentarer og
1 løsning

C fil til DLL (så den kan anvendes fra C#)

Hey.

Jeg besider en fil (XPort.h), som indeholder funktioner der kan læse fra Printerporten.

Denne fil kan jeg tilgå fra C#, hvis blot den kan laves om til en DLL fil... Men jeg har praktisk talt INGEN C erfaring.

Hvordan kan jeg konvertere denne til en DLL-fil?

Er det ligetil, eller skal der laves gennemgribende ændringer i filen.

Det er metoderne WritePort og ReadPort jeg har interesse i.

Bilag:
XPort.h:           
#include <winioctl.h>

    // Port Data Structure
    typedef struct PortData
    {
        ULONG PortAddress;
        UCHAR PortValue;
    } PORTDATA, *PPORTDATA;


    // Device control codes - values between 2048 and 4095 arbitrarily chosen
    // by ME
    #define XPORT_DEVICE 0xCF53
    #define IOCTL_XPORT_WRITE    CTL_CODE(XPORT_DEVICE, 2049, METHOD_BUFFERED, FILE_ANY_ACCESS)
    #define IOCTL_XPORT_READ    CTL_CODE(XPORT_DEVICE, 2050, METHOD_BUFFERED, FILE_ANY_ACCESS)
    #define IOCTL_XPORT_VERSION    CTL_CODE(XPORT_DEVICE, 2051, METHOD_BUFFERED, FILE_ANY_ACCESS)


    // Function protos
    void PortComm( DWORD IOCTL, PPORTDATA InBuffer, UCHAR* OutBuffer,ULONG* ReturnedLength ) ;
    void WritePort( ULONG Address, UCHAR Value) ;
    UCHAR ReadPort( ULONG Address) ;

HANDLE        DriverHandle = INVALID_HANDLE_VALUE;  // Handle to device, obtained from CreateFile

void PortComm( DWORD IOCTL, PPORTDATA InBuffer, UCHAR* OutBuffer,ULONG* ReturnedLength )
{
   

  if (DriverHandle == INVALID_HANDLE_VALUE)        // Was the device opened?
    {
    DriverHandle = CreateFile(
                "\\\\.\\XPort",
                0,
                0,
                NULL,
                OPEN_EXISTING,
                FILE_ATTRIBUTE_NORMAL,
                NULL
                );
        if (DriverHandle == INVALID_HANDLE_VALUE)        // Was the device opened NOW?
        {
                AfxMessageBox ("DEVICE NOT FOUND", MB_OK | MB_ICONERROR);
                CloseHandle( DriverHandle );
                return;
        }
           
    }
   



    if (!DeviceIoControl(DriverHandle,
                        IOCTL,
                        InBuffer,                // Ptr to InBuffer
                        sizeof(PORTDATA),      // Length of InBuffer
                        OutBuffer,                // Ptr to OutBuffer
                        sizeof(UCHAR),            // Length of OutBuffer
                        (ULONG*)ReturnedLength,        // BytesReturned
                        0) )                    // Ptr to Overlapped structure
            {   
                AfxMessageBox ("IOCTL ERROR", MB_OK | MB_ICONERROR);
                CloseHandle( DriverHandle );
                return;
            }

    return;

}

void WritePort( ULONG Address, UCHAR Value)
{
    PORTDATA    PData;
    ULONG        ReturnedLength;            // Number of bytes returned
    UCHAR        ReadData;

        PData.PortValue = Value;
        PData.PortAddress = Address;
        PortComm ((DWORD)IOCTL_XPORT_WRITE, &PData, &ReadData, &ReturnedLength);
}

UCHAR ReadPort( ULONG Address)
{
    PORTDATA    PData;
    ULONG        ReturnedLength;            // Number of bytes returned
    UCHAR        ReadData;

        PData.PortAddress = Address;
        PortComm ((DWORD)IOCTL_XPORT_READ, &PData, &ReadData, &ReturnedLength);
        if (!ReturnedLength)
        {
                AfxMessageBox ("No Data Returned", MB_OK | MB_ICONERROR);
            return 0;
        }
        return ReadData ;

}
Avatar billede soepro Nybegynder
08. oktober 2002 - 14:53 #1
Hvilken compiler skal du lave DLL'en i ?
Avatar billede apocryphal Nybegynder
08. oktober 2002 - 17:49 #2
Aner det ikke...

Jeg har Visual Studio .NET til rådighed.

--
Jonas
Avatar billede asters Nybegynder
08. oktober 2002 - 21:03 #3
Hejsa
Jeg kender ikke så meget til C#, men CreateFile, DeviceIoControl og CloseHandle er alle funktioner i Kernel32.dll, altså win32 funktioner. Ifølge MSDN lib, kan du kalde disse funktioner direkte fra C#. OBS: med mindre du selv kalder CloseHandle, er der en resource leak i selve koden.

Søg på "calling win32 functions from c#" i MSDN lib (evt. online  http://msdn.microsoft.com/library/ pkt. 6)

/Asters
[C#]
using System.Runtime.InteropServices;
[DllImport("user32.dll")]
  public static extern int MessageBox(int hWnd, String text,
                                      String caption, uint type);
Avatar billede apocryphal Nybegynder
29. november 2005 - 14:45 #4
Lukket...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester