Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> И снова dll, никак не могу подгрузить 
:(
    Опции темы
Langaru
Дата 3.9.2009, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем доброго времени суток!
Недавно начал осваивать с++.  Вроде все потихоньку получается, но появились некоторые проблемы, на которые никак не могу найти ответов. А именно:
1. Присоединение dll к программе.
Имеется библиотека (okawsp5.dll), из которой надо вытащить некоторые функции (например функцию wspPST(t), и функция и параметр double). 
В любой литературе, включая ваш форум, указанно, что надо создавать заголовочный файл и прописывать кой-чего в самой длл. 
Собсно вопрос в следующем - как присоединить длл и вытащить из нее функцию в программу без изменения самой длл (написанна не мной и при открытии выдает непонятно что) и без файлов .lib,.def, либо что надо сделать - есть только длл файл и все?
2. Создание функции в отдельном файле.
Все делал как в примерах - перерыл кучу литературы, но все равно фозникает одна и та же ошибка с линком.
Все писалось в Dev-C++ 4.9.9.2.
PM MAIL   Вверх
azesmcar
Дата 3.9.2009, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Langaru

В C++ нет методов для работы с DLL, это все делается по средствам операционной системы. API функции для Windows
LoadLibrary и GetProcAddress
PM   Вверх
Langaru
Дата 3.9.2009, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



На MSDNе и RSDNе тоже смотрел, но так и не понял, что именно надо делать. Можно поподробнее и, желательно, с разъяснениями что, где и как надо делать/писать? smile  

Это сообщение отредактировал(а) Langaru - 3.9.2009, 13:24
PM MAIL   Вверх
azesmcar
Дата 3.9.2009, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



PM   Вверх
Langaru
Дата 3.9.2009, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Тут тоже был, но так же мало что понял...
Код

#include <cstdlib>
#include <iostream>
#include "fordll.h"
//__declspec(dllexport) void __cdecl wspPST(void);

double wspPST(double t);
using namespace std;

int main(int argc, char *argv[])
{
    double dKelvin,dCelsius,dFar; 
    cout<< "Inter tempreche \n";
          cin>>dCelsius;
          dFar=dCelsius*(212-32)/100+32;
          dKelvin=dCelsius+273.15;
          cout<<dFar<<"F \n";
          cout<<dKelvin<<"K \n";
          double dP=wspPST(dKelvin);
          cout<<dP<<"Pa \n";
    system("PAUSE");
    return EXIT_SUCCESS;
}


собсно сама програмка, в которой используется функция wspPST(t)
Код

//fordll.h
#define EXPORT extern "C" __declspec (dllexport)
EXPORT int CALLBACK wspPST(char *str);

.h фаил
Код

//fordll.c
#include 
#include "fordll.h"
int WINAPI DllMain(HINSTANCE hInstance, DWORD fdReason, PVOID pvReserved) 
{
    return TRUE;
}
EXPORT int CALLBACK wspPST(char *str) 
{
       MessageBox(NULL,str,"wspPST",MB_OK);
       return 1;
}

.с файл
выдается следующая ошибка - \main.cpp In file included from main.cpp 
\fordll.h `CALLBACK' does not name a type   
\main.cpp `HINSTANCE' does not name a type 
.....
\Makefile.win [Build Error]  [main.o] Error 1 
что не так и как это "что" надо поправить?
PM MAIL   Вверх
azesmcar
Дата 3.9.2009, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



#include "windows.h" не забыл?
PM   Вверх
Langaru
Дата 3.9.2009, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Забыл) Теперь ошибка следующего плана:
 \main.o(.text+0x1ca) In function `main': 
  [Linker error] undefined reference to `wspPST(double)' 
\main.o(.text+0x1ca) ld returned 1 exit status 
 \Makefile.win [Build Error]  [prob.exe] Error 1 
Собсно при предыдущих попытка присоединения все заканчивалось именно на этой ошибке...
PM MAIL   Вверх
xvr
Дата 3.9.2009, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Собственно правильно ругается - кто такая double wspPST(double t);? В dll у тебя лежит int wspPST(char *str), а для C++ это РАЗНЫЕ функции

PM MAIL   Вверх
Langaru
Дата 3.9.2009, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



double wspPST(double t) - непосредственно та функция, которую нужно вытащить из длл. Изменил, теперь ругается, что невозможно преобразовать double в char:
fordll.c cannot convert `double' to `const CHAR*' for argument `2' to `int MessageBoxA(HWND__*, const CHAR*, const CHAR*, UINT)' 
При изминении на MessageBox(NULL,"t","wspPST",MB_OK)- возвращаемся к старой ошибке... 
Что и где нужно исправить, чтобы вытаскивалась именно "double wspPST(double t)"???
PM MAIL   Вверх
Andrey44
Дата 3.9.2009, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

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



А ты уверен что у тебя есть в ДЛЛ ?
Код

double wspPST(double t);


Добавлено через 4 минуты и 30 секунд
Код

#include "fordll.h"
#pragma comment( lib, "fordll.lib" )

int main(int argc, char *argv[])
{
    double dKelvin,dCelsius,dFar; 
    cout<< "Inter tempreche \n";
          cin>>dCelsius;
          dFar=dCelsius*(212-32)/100+32;
          dKelvin=dCelsius+273.15;
          cout<<dFar<<"F \n";
          cout<<dKelvin<<"K \n";
          double dP=wspPST(dKelvin);
          cout<<dP<<"Pa \n";
    system("PAUSE");
    return EXIT_SUCCESS;
}




--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
xvr
Дата 3.9.2009, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Судя по твоим исходникам у тебя в dll функции double wspPST(double t)  вообще нет, так что и вытащить ее оттуда не получится  smile 
А есть у тебя в dll функция int wspPST(char *str)

Цитата

Изменил, теперь ругается, что невозможно преобразовать double в char:
fordll.c cannot convert `double' to `const CHAR*' for argument `2' to `int MessageBoxA(HWND__*, const CHAR*, const CHAR*, UINT)' 
Угу, MessageBox хочет 2м параметром строку, а ты ему double засовываешь, я бы тоже обиделся  smile 

Цитата

Что и где нужно исправить, чтобы вытаскивалась именно "double wspPST(double t)"??? 
Почитать буквать по С++ для начала. Особенно на темы function overload & extern "C"

PM MAIL   Вверх
Langaru
Дата 3.9.2009, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Дело в том, что данная дллка распространяется бесплатно с лицензионной прогой и в описании сказанно, что пользоваться ей можно на халяву + приводится список функций.
То есть должна быть, но точно я удостоверится не могу, т.к. при открытии дллки отображается непонятно что:
Код

MZº
$LûÜ+š²x

собсно все в том же духе...

Andrey44,  спасибо помогло, но вот только при выполнении программы вылетает окошко с ошибкой и считается не верно... наверное все таки проблема в самой дллке...:(
PM MAIL   Вверх
xvr
Дата 3.9.2009, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Langaru @ 3.9.2009,  14:45)
Дело в том, что данная дллка распространяется бесплатно с лицензионной прогой и в описании сказанно, что пользоваться ей можно на халяву + приводится список функций.
То есть должна быть, но точно я удостоверится не могу, т.к. при открытии дллки отображается непонятно что:
Код

MZº
$LûÜ+š²x

собсно все в том же духе...

Дык, dll это бинарный файл, и открывать его надо не текстовым редактором, а например через objdump например (если уж у тебя Dev-C++ aka gcc)

PM MAIL   Вверх
Langaru
Дата 3.9.2009, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

Дык, dll это бинарный файл, и открывать его надо не текстовым редактором, а например через objdump например (если уж у тебя Dev-C++ aka gcc)

Эээээ.... А если по русски и для "чайников"?) Просто присоединение данной библиотеки сняло бы множество проблем, поэтому очень надо...
PM MAIL   Вверх
andrew_121
Дата 3.9.2009, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



Langaru, с длл-кой поставляется .lib или .h файл?

Добавлено через 22 секунды
дай ссылку на сайт где скачать это можно.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

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


 




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


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

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