Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
ВнизИспользование функций из библиотеки Найти похожие ветки
← →
Алексей (2004-12-30 11:44) [0]Специалисты! Помогите чайнику:
мне необходимо использовать в программе библиотеку
"updatecdb.dll" написанную на С++, однако функции почему-то не загружаются (dll загружаю статически). Получаю сообщение:
"Точка входа в процедуру postINM не найдена в библиотеке DLL
updatecdb.dll!"
часть кода:
....
implementation
{$R *.dfm}
function init:integer;external "updatecdb.dll" name "init";
function postINM (InmBinID:integer):integer;external "updatecdb.dll" name "postINM";
...
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
...
itog,InmBinID:integer;
...
begin
try
...
itog:=postINM(InmBinID);
...
end;
Такая же библиотека, созданная мною средствами Delphi 7, функционирует без проблем.
Подскажите в чем дело!
← →
Skier © (2004-12-30 11:48) [1]а в case sensitive не может быть дело ?
← →
Digitman © (2004-12-30 11:48) [2]
> Получаю сообщение:
> "Точка входа в процедуру postINM не найдена в библиотеке
> DLL
> updatecdb.dll!"
значит, эксп.ф-ции с указанным тобой именем в этой библ-ке действительно нет.
← →
Sancho © (2004-12-30 11:50) [3]Соглашения о вызовах. stdcall + F1
← →
Sancho © (2004-12-30 11:53) [4]Упс, ошибочка
> Алексей (30.12.04 11:44)
> "Точка входа в процедуру postINM не найдена в библиотеке
> DLL
> updatecdb.dll!"
А вот это-то я не удосужился прочитать...пардон.
← →
Алексей (2004-12-30 11:54) [5]Разработчик библиотеке бьет себя в грудину, что эти фунции в библиотеке есть и объявлены на exports.
Пробовал и stdcall - аналогично.
← →
Sancho © (2004-12-30 11:57) [6]
> Алексей (30.12.04 11:54) [5]
> Разработчик библиотеке бьет себя в грудину, что эти фунции
> в библиотеке есть и объявлены на exports.
> Пробовал и stdcall - аналогично.
А может надо чтоб не он себе, а ты ему, и не в грудину, а в бубен :-)))
← →
Digitman © (2004-12-30 11:57) [7]
> Алексей (30.12.04 11:54) [5]
> Разработчик библиотеке бьет себя в грудину
доверяй, но проверяй)
благо инструментария для просмотра потрохов библиотек - навалом ..
> фунции в библиотеке есть и объявлены на exports
а это самый "бьющий в грудину" случаем не метод объекта экспортировал ?
← →
Алексей (2004-12-30 12:01) [8]Sancho! Дельный совет, попробую.
Digitman, вот это я не знаю, буду выяснять, может и по совету Sancho.
← →
Digitman © (2004-12-30 12:09) [9]
> Алексей (30.12.04 12:01) [8]
> вот это я не знаю
не знать это именно тебе - может и не грех .. хотя выяснить истину - раз плюнуть ..
а вот не знать самому разработчику, чего он там "наэкспортировал" и впарил тебе тряся грудиной - вот за это, "по совету Sancho", можно и в бубен)
← →
Алексей (2004-12-30 12:11) [10]Digitman, подскажи, как можно выяснить истину.
← →
У (2004-12-30 12:26) [11]Посмотри tdump"ом эту ДЛЛ -
какие имена там на самом деле.
← →
Алексей (2004-12-30 12:27) [12]>а это самый "бьющий в грудину" случаем не метод объекта экспортировал ?
>не знать это именно тебе - может и не грех .. хотя выяснить истину - раз плюнуть ..
Digitman, подскажи, как можно выяснить истину.
← →
Алексей (2004-12-30 12:30) [13]Digitman, спасибо!
Всем большое спасибо, с наступающим Новым годом!
Удачи!
← →
Digitman © (2004-12-30 12:35) [14]
> Алексей (30.12.04 12:30) [13]
нашел в чем беда была ?
рассказал бы хоть ... интересно же)
← →
Алексей (2004-12-30 12:38) [15]Digitman
Пока не нашел, буду звонить и пытать разработчика.
Результат "пыток" сообщу
← →
У (2004-12-30 12:41) [16]так ты посмотрел tdump"ом?
может, там банальный манглинг имён?
← →
Алексей (2004-12-30 13:39) [17]Digman
Посмотрел: с именами проблем нет, но у меня вызывает сомнение следующий код (правда в С++ я полный "БМП" - без малейшего поятия)
Содержимое файла "updatecdb.h":
#ifndef _updatecdb.h
#define _updatecdb.h
#ifdef __DLL__
//# define DLL_EI __declspec(dllexport)
#define EXPORT_TYPE__export
#else
//# define DLL_EI __declspec(dllimport)
#define EXPORT_TYPE __import
#endif
...
extern "C" int DLL_EI init(void);
extern "C" int DLL_EI postINM(int y);
...
#endif
Код файла "updatecdb.cpp":
//---------------------------------------------------------------
#include <vcl.h>
#include <windows.h>
#include "updatecdb.h"
#pragma hdrstop
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------
int init()
{
...
return 0;
}
//---------------------------------------------------------------
int postINM(int y)
{
...
return y;
}
//---------------------------------------------------------------
← →
Digitman © (2004-12-30 13:50) [18]
> Посмотрел: с именами проблем нет
не понял ... ты в исходник что ли смотрел ?
нафих он тебе сдался, этот исходник) ... разработчик вполне мог с бодуна передать тебе текст, НЕ являющийся оригиналом для реально построенного им DLL-файла, переданного тебе для юзанья ..
тебя про результаты исследования dll-файла tdump"ом спросили ..
и каковы они ?
← →
Eraszer (2004-12-30 17:03) [19]используй диррективу cdecl
← →
Алексей (2004-12-30 18:38) [20]Eraszer
Пробовал - не помогает.
← →
DiamondShark © (2004-12-30 19:26) [21]Ну так посмотри tdump-ом или ещё какой утилитой точные имена экпортируемых функций.
← →
Алексей (2004-12-30 21:41) [22]Digitman
Eraszer
DiamondShark
Спасибо большое всем за помощь! Особенно Digitman Eraszer и DiamondShark! Я понимаю, что спасибо слишком много, а стакан "красненького" в самый раз, но как говаривал один маршал: "Все, что могу".
Теперь суть дела:
1) просмотрел tdump-ом - в именах функций добавлен дефис, то есть вместо имени "init" стоит имя "_init" и ,соответственно, вместо "postInm" - "_postInm";
2) необходимо использовать директиву "cdecl".
Еще раз Всем спасибо и с наступающим Новым годом! Удачи!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.036 c