Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Использование функций из библиотеки [D7, WinXP]


Страницы:   1 2

Алексей ©   (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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо