Форум программистов, компьютерный форум CyberForum.ru

Вызов функции из dll - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.70
rotesbyte
0 / 0 / 1
Регистрация: 26.07.2009
Сообщений: 64
24.01.2011, 13:24     Вызов функции из dll #1
Привет всем!
Пишу программу на Java. Спокойно, форум тот... Моя программа должна работать с устройством, висящим на LPT-порте. Для этого мне приходится с помощью JNI вызывать нативные методы из виндушной DLL-ки, написанной на C++ и шедшей вместе с устройством.

Всё это должно быть организовано следующим образом: между моей Java-программой и виндушной DLL-кой я должен вставить свою DLL-ку, написанную на C++. Она будет получать вызовы методов из Java, сама вызывать функции из виндушной DLL-ки, получпть от неё ответы и отдавать назад в Java-программу.

Вся проблема в том, что в C++ я, мягко говоря, не крупный спец...
Как вызывать из мой DLL-ки функции, лежащие в виндушной DLL-ке я, вроде, нашёл. Вызывать буду неявной компоновкой - у меня ест header-файл.
Моя проблема состоит в следующем:
Каждая вызываемая мной функция в виндушной DLL-ке имеет параметр --HANDLE AppHandle--. Тут-то моя проблема...

Вот оригинальное описание одной из этих функций (из виндушной DLL-ки):
Код
DeviceStartUp
-------------
Parameter:    HANDLE AppHandle
Return Value: int
Return Codes:
              DEVICE OK : Success
              DEVICE ERROR: error occured
              DEVICE NOT INIT: DelsyInit was not successful
Description:
DeviceStartUp informs the DEVICE-drivers about the application, and load the hardware-DLLs if necessary. The application handle is used for the unique identification of the processes and is needed on every function call. The display of messages and similar actions are also realized by this procedure.
Вот кусок примера вызова этой функции из проекта на Borland C++:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void __fastcall TForm1::FormShow(TObject *Sender)
{
char *Err;int i;
char Version[100];
 
............
 
if (DeviseStartUp(this)==DEVISE_ERROR)
  { DeviceGetError(this,&Err,&i);
    Label4->Caption='Device Error Nr. ' + (AnsiString) i;
    Label5->Caption=Err;
  }
 
............
 
}
Теперь вопросы:
1. Чей хэндл должен Я указывать чтобы это У МЕНЯ заработало? Ведь я использую нативные методы из Java-программы...
2. Как его получить?
Если можно, дайте кусок кода.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
bazile
55 / 31 / 17
Регистрация: 15.03.2007
Сообщений: 6,912
24.01.2011, 13:50     Вызов функции из dll #2
Параметр AppHandle функции DeviceStartUp как следует из приведенного описания служит уникальным id позволяюшим библиотеке (и устройству) различать разные приложения на случай если их несколько.

Пример на C++ передает в качестве параметра значение указателя this - его значение будет разным для разных приложений, но одинаковым в функциях членах класса Form1. В Java вроде тоже есть указатель this, если не ошибаюсь. Если нет, то можно при запуске приложения генерировать случайное 4-х байтовое число и передавать его.

Еще вариант передавать в качестве AppHandle id текущего процесса Windows. Вот так:
DWORD appHandle = GetCurrentProcessId();
DeviseStartUp(appHandle);
rotesbyte
0 / 0 / 1
Регистрация: 26.07.2009
Сообщений: 64
25.01.2011, 13:09  [ТС]     Вызов функции из dll #3
Привет, bazile!
Спасибо за ответ.

Вариант с передачей ID процесса Java-программы попробую.

А вот второй вариант (передавать в качестве AppHandle id текущего процесса Windows, тоесть моей DLL-ки), наверное, не пройдёт.
Как я понимаю, этот ID в течение работы моей программы должен быть один и тот же. Моя DLL-ка вызывается из Java-программы периодически и, как я понимаю, при каждом вызове будет иметь другой ID процесса...

Но я всё равно попробовал. Пусть я вызову хотя бы одну функцию...
Вот кусок .cpp-файла моей DLL-ки на C++:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <windows.h>
//#include 'device.h'
#include 'Fingerprint.h'
 
__declspec(dllimport) int DeviceStartUp(HANDLE AppHandle);
.............
 
extern 'C'
JNIEXPORT jint JNICALL Java_fingerprint_Fingerprint_DeviceStartUp
    (JNIEnv* env, jclass cl)
{   
    return DeviceStartUp((HANDLE)GetCurrentProcessId());
}
Но мой 'Dev C++' v.4.9.9.0 + gcc.exe compiler при компиляции выдаёт ошибку:

[Linker error] undefined reference to `_imp___Z12DeviceStartUpPvPcS0_'

Вот мой Compiler log:
Compiler: Default compiler
Building Makefile: 'E:ProjekteTestFingerPrintCppMakefile.win'
Führt make... aus
make.exe -f 'E:ProjekteTestFingerPrintCppMakefile.win' all
g++.exe -c Fingerprint.cpp -o Fingerprint.o -I'C:/Dev-Cpp/include/c++/3.3.1' -I'C:/Dev-Cpp/include/c++/3.3.1/mingw32' -I'C:/Dev-Cpp/include/c++/3.3.1/backward' -I'C:/Dev-Cpp/lib/gcc-lib/mingw32/3.3.1/include' -I'C:/Dev-Cpp/include' -I'D:/Programme/Java/j2sdk1.4.2_05/include/' -I'D:/Programme/Java/j2sdk1.4.2_05/include/win32/' -DBUILDING_DLL=1

dllwrap.exe --output-def libFingerprint.def --driver-name c++ --implib libFingerprint.a Fingerprint.o -L'C:/Dev-Cpp/lib' --no-export-all-symbols --add-stdcall-alias -o Fingerprint.dll

Fingerprint.o(.text+0x4f):Fingerprint.cpp: undefined reference to `_imp___Z12DelsyStartUpPvPcS0_'

dllwrap.exe: no export definition file provided.
Creating one, but that may not be what you want
dllwrap.exe: c++ exited with status 1

make.exe: *** [Fingerprint.dll] Error 1

Ausführung beendet
Что я здесь делаю неправильно?

Итак вопрос, с которого всё началось всё еще остаётся открытым...
man_of_ring
4 / 4 / 0
Регистрация: 09.12.2010
Сообщений: 278
01.02.2011, 18:38     Вызов функции из dll #4
а говорит он что в тоем lib'е нет какого то объявления...
Fingerprint.cpp: undefined reference to `_imp___Z12DelsyStartUpPvPcS0_'

в файле Fingerprint.cpp погляди что это - _imp___Z12DelsyStartUpPvPcS0_

ЗЫ. Кстати я тут на джаву хочу пересесть, поставил JBuilder 5
есть что почитать по нему?
экземплы, инфа все приветствуються.
на релибе я частый гость )
пиши

Спасибо.
Yandex
Объявления
01.02.2011, 18:38     Вызов функции из dll
Ответ Создать тему
Опции темы

Текущее время: 21:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru