Перенос простой программы c с linux на windows

Я хочу написать простую программу на c, чтобы делать следующее. Откройте соединение с параллельным портом, сделайте вывод 2 высоким, сделайте вывод 2 низким и закройте соединение. Я использую для этого JNI, поэтому мой исходный файл Java выглядит следующим образом.

package meas;

public class Meas {

    public static native boolean open();

    public static native boolean on();

    public static native boolean off();

    public static native boolean close();

}

Обратите внимание, что файл Java должен управлять параллельным портом, т.е. решать, когда он должен быть высоким или низким. Затем я извлек заголовочный файл c с помощью javah.

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class meas_Meas */

#ifndef _Included_meas_Meas
#define _Included_meas_Meas
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     meas_Meas
 * Method:    open
 * Signature: ()Z
 */
JNIEXPORT jboolean JNICALL Java_meas_Meas_open
  (JNIEnv *, jclass);

/*
 * Class:     meas_Meas
 * Method:    on
 * Signature: ()Z
 */
JNIEXPORT jboolean JNICALL Java_meas_Meas_on
  (JNIEnv *, jclass);

/*
 * Class:     meas_Meas
 * Method:    off
 * Signature: ()Z
 */
JNIEXPORT jboolean JNICALL Java_meas_Meas_off
  (JNIEnv *, jclass);

/*
 * Class:     meas_Meas
 * Method:    close
 * Signature: ()Z
 */
JNIEXPORT jboolean JNICALL Java_meas_Meas_close
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

Затем я реализовал это для Linux:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/io.h>
#include <sys/types.h>
#include <fcntl.h>
#include <meas_Meas.h>

#define BASEPORT 0x378 /* lp1 */

int tem;

/*
 * Class:     meas_Meas
 * Method:    open
 * Signature: ()Z
 */
JNIEXPORT jboolean JNICALL Java_meas_Meas_open(JNIEnv *env, jclass clz) {
    //set permissions to access port
    if (ioperm(BASEPORT, 3, 1)) {
        perror("ioperm");
        exit(1);
    }

    tem = fcntl(0, F_GETFL, 0);
    fcntl(0, F_SETFL, (tem | O_ASYNC));
}

/*
 * Class:     meas_Meas
 * Method:    on
 * Signature: ()Z
 */
JNIEXPORT jboolean JNICALL Java_meas_Meas_on(JNIEnv *env, jclass clz) {
    outb(255, BASEPORT);
}

/*
 * Class:     meas_Meas
 * Method:    off
 * Signature: ()Z
 */
JNIEXPORT jboolean JNICALL Java_meas_Meas_off(JNIEnv *env, jclass clz) {
    outb(0, BASEPORT);
}

/*
 * Class:     meas_Meas
 * Method:    close
 * Signature: ()Z
 */
JNIEXPORT jboolean JNICALL Java_meas_Meas_close(JNIEnv *env, jclass clz) {

    fcntl(0, F_SETFL, tem);
    outb(0, BASEPORT);

    //take away permissions to access port
    if (ioperm(BASEPORT, 3, 0)) {
        perror("ioperm");
        exit(1);
    }
}

Я не занимаюсь экспортом на C, поэтому приведенный выше код может выглядеть странно. Но на самом деле это не имеет значения. Важно то, что я хочу реализовать это и для Windows. Цель - получить dll, как у меня уже есть libMeas.so для Linux. У меня уже работает MinGW, но проблема в том, что в Windows вы не можете использовать sys / io.h. Поиск в Google документации о том, как это сделать, приводит к появлению руководств по записи данных в параллельный порт. Я не хочу этого, я просто хочу сделать вывод 2 высоким или низким. Я предполагаю, что это должно быть довольно просто. Может ли кто-нибудь указать мне в правильном направлении, как это сделать для Windows (используя тот же файл заголовка)?


person meijuh    schedule 21.05.2012    source источник
comment
скомпилируйте код c с помощью Dev-C ++, в нем есть все заголовочные файлы c linux. в любом случае, если вы компилируете код на Linux, я понятия не имею   -  person jondinham    schedule 21.05.2012


Ответы (3)


Чтобы скомпилировать код C в Windows, вы должны добавить #ifdefs вокруг всех особенностей (outb, fcntl).

Используйте встроенные функции _inp / _outp для прямого доступа к портам. См. MSDN для этого.

http://msdn.microsoft.com/en-us/library/y7ae61bc(v=vs.80).aspx

Чтобы получить файл .dll с помощью MinGW (gcc / win32), просто используйте переключатель командной строки «-shared».

gcc -o libMeas.dll -shared source.c <your_libraries_for_win32>

i586-mingw32msvc-gcc также работает в Linux (кросс-компиляция)

Также есть проблемы с версией x64.

Похоже, вам нужно использовать драйвер для такого рода вещей, потому что _inp / _outp доступны в DDK (Driver DevKit), а не "из коробки".

Посмотрите здесь http://www.highrez.co.uk/downloads/inpout32/default.htm для 32- и 64-битных драйверов.

Есть целая ветка о чтении параллельных портов в управляемой среде (в этом случае .NET, но, я думаю, JNI тоже подойдет): http://www.vbforums.com/showthread.php?t=643913

person Viktor Latypov    schedule 21.05.2012
comment
Очевидно _outp можно использовать только в версиях Windows до Windows XP. Код должен работать на windows xp и выше. Каков самый простой способ просто записать 255 на параллельный порт в Windows XP и выше? - person meijuh; 21.05.2012
comment
Ты прав. Также есть проблемы с версией x64. Пока не могу придумать, как записать эти байты. - person Viktor Latypov; 21.05.2012
comment
В настоящее время я просматриваю logix4u.net/parallel-port/16-inpout32dll -for-windows-982000ntxp. Посмотрим, как это пойдет. - person meijuh; 21.05.2012

У этого есть интерфейс JNI для параллельного порта http://www.hytherion.com/beattidp/comput/pport.htm

person george calvert    schedule 21.05.2012

Я получил его, работая с dll, полученным из http://logix4u.net/parallel-port/16-inpout32dll-for-windows-982000ntxp. Вместе с этой dll появился заголовочный файл c всего с двумя функциями. Inp32 () и Out32 (). Что можно использовать для чтения и записи слов непосредственно в параллельный порт, точно так же, как устаревшие функции _inp () и _out () в conio.h. По сути, это означает, что я могу получить прямой доступ к параллельному порту в пользовательском режиме.

Кстати. вам нужно немного покопаться, чтобы найти двоичные файлы на logix4u.net; его можно найти здесь: http://logix4u.net/parallel-port/parallel-port/index.php?option=com_content&task=view&id=26&Itemid=1 кажется, что также существует 64-битная версия этой dll, которая поддерживает Windows Vista и, надеюсь, Windows 7 .

person meijuh    schedule 22.05.2012