![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Использование функций из библиотеки [D7, WinXP]
Алексей © (2004-12-30 11:44:00)Специалисты! Помогите чайнику:
мне необходимо использовать в программе библиотеку
"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, функционирует без проблем.
Подскажите в чем дело!
Алексей (2004-12-30 21:41:00) [1]Digitman
Eraszer
DiamondShark
Спасибо большое всем за помощь! Особенно Digitman Eraszer и DiamondShark! Я понимаю, что спасибо слишком много, а стакан "красненького" в самый раз, но как говаривал один маршал: "Все, что могу".
Теперь суть дела:
1) просмотрел tdump-ом - в именах функций добавлен дефис, то есть вместо имени "init" стоит имя "_init" и ,соответственно, вместо "postInm" - "_postInm";
2) необходимо использовать директиву "cdecl".
Еще раз Всем спасибо и с наступающим Новым годом! Удачи!
DiamondShark (2004-12-30 19:26:00) [2]Ну так посмотри tdump-ом или ещё какой утилитой точныеимена экпортируемых функций.
Алексей (2004-12-30 18:38:00) [3]Eraszer
Пробовал - не помогает.
Eraszer (2004-12-30 17:03:00) [4]используй диррективу cdecl
Digitman (2004-12-30 13:50:00) [5]
> Посмотрел: с именами проблем нет
не понял ... ты в исходник что ли смотрел ?
нафих он тебе сдался, этот исходник) ... разработчик вполне мог с бодуна передать тебе текст, НЕ являющийся оригиналом для реально построенного им DLL-файла, переданного тебе для юзанья ..
тебя про результаты исследования dll-файла tdump'ом спросили ..
и каковы они ?
Алексей (2004-12-30 13:39:00) [6]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;
}
//---------------------------------------------------------------
У (2004-12-30 12:41:00) [7]так ты посмотрел tdump'ом?
может, там банальный манглинг имён?
Алексей (2004-12-30 12:38:00) [8]Digitman
Пока не нашел, буду звонить и пытать разработчика.
Результат "пыток" сообщу
Digitman (2004-12-30 12:35:00) [9]
> Алексей (30.12.04 12:30) [13]
нашел в чем беда была ?
рассказал бы хоть ... интересно же)
Алексей (2004-12-30 12:30:00) [10]Digitman, спасибо!
Всем большое спасибо, с наступающим Новым годом!
Удачи!
Алексей (2004-12-30 12:27:00) [11]>а это самый "бьющий в грудину" случаем не метод объекта экспортировал ?
>не знать это именно тебе - может и не грех .. хотя выяснить истину - раз плюнуть ..
Digitman, подскажи, как можно выяснить истину.
У (2004-12-30 12:26:00) [12]Посмотри tdump'ом эту ДЛЛ -
какие имена там на самом деле.
Алексей (2004-12-30 12:11:00) [13]Digitman, подскажи, как можно выяснить истину.
Digitman (2004-12-30 12:09:00) [14]
> Алексей (30.12.04 12:01) [8]
> вот это я не знаю
не знать это именно тебе - может и не грех .. хотя выяснить истину - раз плюнуть ..
а вот не знать самому разработчику, чего он там "наэкспортировал" и впарил тебе тряся грудиной - вот за это, "по совету Sancho", можно и в бубен)
Алексей (2004-12-30 12:01:00) [15]Sancho! Дельный совет, попробую.
Digitman, вот это я не знаю, буду выяснять, может и по совету Sancho.
Digitman (2004-12-30 11:57:00) [16]
> Алексей (30.12.04 11:54) [5]
> Разработчик библиотеке бьет себя в грудину
доверяй, но проверяй)
благо инструментария для просмотра потрохов библиотек - навалом ..
> фунции в библиотеке есть и объявлены на exports
а это самый "бьющий в грудину" случаем не метод объектаэкспортировал ?
Sancho (2004-12-30 11:57:00) [17]
> Алексей (30.12.04 11:54) [5]
> Разработчик библиотеке бьет себя в грудину, что эти фунции
> в библиотеке есть и объявлены на exports.
> Пробовал и stdcall - аналогично.
А может надо чтоб не он себе, а ты ему, и не в грудину, а в бубен :-)))
Алексей (2004-12-30 11:54:00) [18]Разработчик библиотеке бьет себя в грудину, что эти фунции в библиотеке есть и объявлены на exports.
Пробовал и stdcall - аналогично.
Sancho (2004-12-30 11:53:00) [19]Упс, ошибочка
> Алексей (30.12.04 11:44)
> "Точка входа в процедуру postINM не найдена в библиотеке
> DLL
> updatecdb.dll!"
А вот это-то я не удосужился прочитать...пардон.
Sancho (2004-12-30 11:50:00) [20]Соглашения о вызовах. stdcall + F1