Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с использованием dll, dll 
V
    Опции темы
Шкурик
Дата 18.9.2017, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 17.9.2017

Репутация: нет
Всего: нет



Доброго времени суток уважаемые программеры!
Проблема в том, что в связи с полным отсутствием опыта никак не могу скомпилить проект с использованием dll. Сразу скажу, что ни уж несколько дней настойчиво гуглю и экспериментирую, но результата ноль. Топиков в сети много, но ни один вариант не помог.
Дано: Библиотека реализации программного уровня протокола Wake для связи с внешними устройствами через COM порт Wake protokol. В наличии - файлы библиотеки wsp32.dll, wsp32.lib, wsp32.h, wsp32.cpp.
Задача: Прилинковать эту dll к проекту, чтобы можно было использовать ее функции.
Инструменты: Первый - среда devcpp 4.9.9.2 (Mingw port of GCC). Второй - Visual C++ 2008 Express.
Что делалось: Пытался использовать неявное подключение библиотеки, но на опрепделенном этапе появилась чуйка, что проект создан автором в Borland и я его в своих средах никогда неявно не слинкую.
И наконец попытался подключить явно. В качестве теста попытался использовать только одну функцию:
Код

#include <windows.h>
#include <cstdlib>
#include <iostream>
#include <fstream>

using namespace std;

typedef bool WINAPI (*AccessCOM)(char *P);

int main(int argc, char *argv[])
{
    HINSTANCE hwsp32 = ::LoadLibrary(L"wsp32.dll");
    P_AccessCOM pAccessCOM = (P_AccessCOM)::GetProcAddress(hwsp32, "AccessCOM");
    
    HINSTANCE hwsp32;
::
if((hwsp32=::LoadLibrary("wsp32"))==NULL) { }
else { }

typedef bool (WINAPI *AccessCOM(char *P);
::
PFN_AccessCOM pfnAccessCOM;

hwsp32=::LoadLibrary("wsp32");
pfnAccessCOM=(PFN_AccessCOM)::GetProcAddress(hwsp32,"AccessCOM");
::
    char* port_name = "COM1";
    if (*pfnAccessCOM(port_name))
        {cout<<"Ok";}
    else {cout<<"Error";}
    
    system("PAUSE");
    return EXIT_SUCCESS;
}

Журнал компиляции:
Код

rm -f main.o  Project_1.exe

g++rus.exe -c main.cpp -o main.o -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include"  -I"C:/Dev-Cpp/include/c++/3.4.2/backward"  -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32"  -I"C:/Dev-Cpp/include/c++/3.4.2"  -I"C:/Dev-Cpp/include"   

main.cpp: In function `int main(int, char**)':

main.cpp:12: error: cannot convert `const wchar_t*' to `const CHAR*' for argument `1' to `HINSTANCE__* LoadLibraryA(const CHAR*)'
main.cpp:13: error: `P_AccessCOM' undeclared (first use this function)
main.cpp:13: error: (Each undeclared identifier is reported only once for each function it appears in.)
main.cpp:13: error: expected `;' before "pAccessCOM"
main.cpp:15: error: redeclaration of `HINSTANCE__*hwsp32'
main.cpp:12: error: `HINSTANCE__*hwsp32' previously declared here
main.cpp:17: error: expected id-expression before "if"

main.cpp:17: error: expected `;' before "if"
main.cpp:18: error: expected primary-expression before "else"
main.cpp:18: error: expected `;' before "else"
main.cpp:20: error: expected `)' before ';' token

main.cpp:22: error: `::PFN_AccessCOM' has not been declared
main.cpp:22: error: expected `;' before "pfnAccessCOM"
main.cpp:25: error: `pfnAccessCOM' undeclared (first use this function)
main.cpp:25: error: `PFN_AccessCOM' undeclared (first use this function)
main.cpp:25: error: expected `;' before '::' token
main.cpp:27: error: expected id-expression before "char"
main.cpp:27: error: expected `;' before "char"
main.cpp:28: error: `port_name' undeclared (first use this function)

g++rus.exe main.o  -o "Project_1.exe" -L"C:/Dev-Cpp/lib" -L"d:/C++_Programs/Project_1"   

g++.exe: main.o: No such file or directory
g++.exe: no input files

Это все в Dev-C++. Эта среда мне как-то ближе всего. Но если ничего не получится, можно перейти на VC++. Сейчас основная тема для меня - это сам язык через консольные приложения и общение с железяками (устройства на микроконтроллерах) через COMport.
Исходники библиотеки прилепил.

Заранее благодарен!

Это сообщение отредактировал(а) Шкурик - 18.9.2017, 09:44

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  wsp_dll.zip 29,96 Kb
PM MAIL   Вверх
xvr
Дата 18.9.2017, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Во первых - ваш main это буйная помесь как минимум 3х разных попыток загрузить библиотеку и взять адрес функции (все 3 попытки неправильные)
Так же прослеживается помесь С++ и С, и Unicode/ANSII режимов компиляции

Цитата(Шкурик @  18.9.2017,  01:13 Найти цитируемый пост)
Но если ничего не получится, можно перейти на VC++.

Там будет тоже самое.

Для начала отделите мух от котлет и загрузите вашу библиотеку. Хинт - вызовы LoadLibrary и GetProcAddress должны присутствовать в ОДНОМ экземпляре. Тайпдеф для вашей AccessCOM должен быть тоже один, и его использование в тексте должно так же быть AccessCOM , а не P_AccessCOM и не PFN_AccessCOM


Цитата(Шкурик @  18.9.2017,  01:13 Найти цитируемый пост)
 но на опрепделенном этапе появилась чуйка, что проект создан автором в Borland и я его в своих средах никогда неявно не слинкую.

Посмотрел на сорцы - может и слинковаться и заработать, но не факт :(
Включите ее в свой проект как сорцы (только __fastcall из них уберите) - должно заработать


PM MAIL   Вверх
Шкурик
Дата 18.9.2017, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 17.9.2017

Репутация: нет
Всего: нет



XVR! Спасибо Вам огромное, что откликнулись! Буду разбираться. Очень бы хотелось добить этот вопрос.
PM MAIL   Вверх
Шкурик
Дата 18.9.2017, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 17.9.2017

Репутация: нет
Всего: нет



Вопрос решился!
Вот тестовый код, который скомпилился и сделал то, что от него и требовалось:проверил наличие порта, открыл его, отослал пакет и закрыл порт.
Код

#include <windows.h>
#include <cstdlib>
#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char *argv[])
{
    HINSTANCE hModule=NULL;
    
    hModule=::LoadLibrary("wsp32.dll");
    if (hModule!=NULL)
    {
        cout << "Ok Load DLL" << endl;
        
        bool (*pAccessCOM)(char*);
        bool (*pOpenCOM)(char*,double);
        bool (*pCloseCOM)();
        bool (*pTxFrame)(unsigned char, unsigned char, unsigned char, unsigned char*);
        (FARPROC &)pAccessCOM = GetProcAddress(hModule, "AccessCOM");
        (FARPROC &)pOpenCOM = GetProcAddress(hModule, "OpenCOM");
        (FARPROC &)pCloseCOM = GetProcAddress(hModule, "CloseCOM");
        (FARPROC &)pTxFrame = GetProcAddress(hModule, "TxFrame");
        
        if (pAccessCOM!=NULL)
        {
            cout << "Ok Load function" << endl;
            
            char* port_name = "COM1";
            if (pAccessCOM(port_name))
                {
                    cout<<"COM port - Ok";
                    unsigned char data[5]={'1','2','3','4','5'};
                    pOpenCOM("COM1",9600);
                    pTxFrame(1,2,5,data);
                    pCloseCOM();
                    cout<<"TX - Ok";
                }
            else {cout<<"COM port - Error";}
        }
        else cout << "Error Load function" << endl;
        ::FreeLibrary(hModule); 
    }
    else cout << "error load Dll" << endl;
    
}


Только правда с typedef не совладал в контексте этой задачи. А вот FARPROC помог. Но главное тут было то, что добрый человек задал правильное направление, за что XVR Вам еще раз большое спасибо. Я хоть действительно отделил котлеты от мух и нашел действительно рабочий подход. В другой раз попробую через typedef, но это уже будет совсем другая история.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1138 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.