Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.28;
Скачать: CL | DM;

Вниз

Подключение DLL написаной на VC++ в проекте Delphi   Найти похожие ветки 

 
LexusU   (2006-12-01 14:39) [0]

Имеются библиотеки написанные на VC++. Известно какие процедуры в этих библиотеках есть. пытаюсь подключить DLL в Delphi. Проект компилируется без ошибок. При запуске проекта выпадает ошибка - пишет что точка входа процедуры в DLL не найдена.

Привожу исходники:

{== Интерфейсный модуль ==}
{ Здесь описываю процедуры из DLL, затем этот модуль подключаю к основному}

unit UnitFromVC;

interface

{$IFNDEF FromVC}
procedure OpenExchange (Signature:string);stdcall;
{$ENDIF}

implementation

{$IFNDEF FromVC}
procedure OpenExchange; external "IEC104Chan.dll" name "OpenExchange";
{$ENDIF}

end.

...........................

{== Модуль основной  ==}
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
UnitFromVC ;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
   sig:string;
begin

sig:="Test string";
OpenExchange(sig);

end;

end.

Что я не так делаю?


 
clickmaker ©   (2006-12-01 14:45) [1]


> {$IFNDEF FromVC}
> procedure OpenExchange (Signature:string);stdcall;
> {$ENDIF}

а это что? и зачем 2 раза
просто
procedure OpenExchange; stdcall; external "IEC104Chan.dll" name "OpenExchange";


 
MBo ©   (2006-12-01 15:08) [2]

>Signature:string
Такого точно не должно быть

>точка входа процедуры в DLL не найдена
Используется ли в DLL искажение имен (Name Mangling)?
Если да (посмотри утилитой TDump из Delphi/bin), то имена функций будут типа _OpenExchange@8****


 
Сергей М. ©   (2006-12-01 15:26) [3]


> пишет что точка входа процедуры в DLL не найдена.


Это значит только одно - не найдена.
Т.е. нет в этом РЕ-модуле интересующего экспортируемого имени.


 
LexusU   (2006-12-01 18:05) [4]

> пишет что точка входа процедуры в DLL не найдена.
такое имя в библиотеке есть точно.

>Signature:string
? а как я должен ДЛЛ передавать параметр?


 
clickmaker ©   (2006-12-01 18:34) [5]


> ? а как я должен ДЛЛ передавать параметр?

PChar либо const PChar


 
Desdechado ©   (2006-12-01 18:50) [6]

> а как я должен ДЛЛ передавать параметр?
согласно заголовочного файла библиотеки


 
evvcom ©   (2006-12-04 09:20) [7]

> [4] LexusU   (01.12.06 18:05)
> > пишет что точка входа процедуры в DLL не найдена.
> такое имя в библиотеке есть точно.

Говорят нет, значит нет такого. Оно может быть искажено. Проверь совет [2]


 
palva ©   (2006-12-04 10:41) [8]

Если имя есть, а делфи говорит, что нет, значит надо выбросить делфи.


 
LexusU   (2006-12-04 10:43) [9]

Немного я в постновке задачи ошибся наверное. Библиотека с помощью классов написана. Вообщем вот что разрабочик библиотеки пишет(но это для использования библиотеки в том же VC++):
**********************************
* Как внедрить  в проект
1. Включить в проект файлы RTSH.h b IEC104.lib
2. Создать собственный класс канала(), наследуемый от класса CRTSH c обязательными и необязательными виртуальными функциями.

Пример:

class CMyChan :  public CRTSH
{
...
// Обязательные описания
  virtual void OnDisconnect(int channel);  // Cоединение потеряно
  virtual void OnConnect(int channel); // Соединение восстановлено
// Необязательные описания
   virtual void ImportSignal(int chan, BYTE n_obj, BYTE* time);
   virtual void ImportError (int chan, DWORD error_flag);
...
}

3. Создать экземпляр этого класса
Пример:
 CMyChan Chan_104;

4. Открыть канал, выхвав функцию OpenExchange(const CString& Sig)
Пример:
  CString Sig="TCP 192.168.1.1:5500"
**********************************
Это значит и в Delphi надо класс объявлять, и через него работать?


 
Сергей М. ©   (2006-12-04 10:50) [10]


> Это значит и в Delphi надо класс объявлять, и через него
> работать?


Это значит, что эта библиотека не годится для использования в Делфи.


 
LexusU   (2006-12-04 10:54) [11]

добавил новый класс в основной  модуль

 TChanClass = class
 public
  procedure OnDisconnect (Channel:integer); virtual; stdcall; abstract;
  procedure OnConnect (Channel:integer); virtual; stdcall; abstract;
  procedure ImportSignal(Chan:integer; n_obj:byte; time:byte);  virtual; stdcall; abstract;
  procedure OpenExchange (Sig:string); virtual; stdcall; abstract;
 end;

вызываю в программе
var ChClass:TChanClass;
...
ChClass.OpenExchange (Signature);

усе равно не пашет. компилируется и запускается без ошибок. При выполнении процедуры выдает ошибку Access violation...


 
Сергей М. ©   (2006-12-04 11:05) [12]


> LexusU   (04.12.06 10:54) [11]


Не будет это работать.


 
Anatoly Podgoretsky ©   (2006-12-04 11:15) [13]

> Сергей М.  (04.12.2006 10:50:10)  [10]

Это также значит, что подобную библиотеку нельзя назвать честной DLL


 
Anatoly Podgoretsky ©   (2006-12-04 11:16) [14]

> LexusU  (04.12.2006 10:54:11)  [11]

Дельфи ничего не знает про классы другого языка и не умеет с ними работать.


 
Сергей М. ©   (2006-12-04 11:17) [15]


> Anatoly Podgoretsky ©   (04.12.06 11:15) [13]


Не возражаю)


 
oxffff ©   (2006-12-04 12:00) [16]


> Сергей М. ©   (04.12.06 10:50) [10]
>
> > Это значит и в Delphi надо класс объявлять, и через него
>
> > работать?
>
>
> Это значит, что эта библиотека не годится для использования
> в Делфи.


Если есть структрура классов C++, то можно установить смещение VTB
Можно написать порт.
Правда надо иметь огромное желание заниматься этим.


 
oxffff ©   (2006-12-04 12:08) [17]

Если базовый класс на С++, имеет виртуальную функцию, и другие благоприятные условия, то можно сказать что ПОВЕЗЛО.


 
DevilDevil ©   (2006-12-04 12:17) [18]

Есть возможность изменить Dll?

Если есть, то можно сделать что-то типа:

TChanClass* __fastcall CreateChanClass()
{
 TChanClass* R = new TChanClass;
 return R;
}

void __fastcall DestroyChanClass(TChanClass* C)
{
 delete C;
}

void __fastcall MyOpenExchange(TChanClass* C, char* sig);
{
 // необходимо корректное строковое преобразование
 // как в Си это правильно сделать, я не знаю, может просто так:
 C->OpenExchange(sig);  
}


а в Delphi пишешь так:

type TChanID = pointer;

function CreateChanClass : TChanID {без stdcall} ...
procedure DestroyChanClass(ChanID : TChanID); ...
procedure MyOpenExchange(ChanID : TChanID; sig : pchar); ...

VAR
  ID : TChanID;
begin
  ID := CreateChanClass;
  MyOpenExchange(ID, "Test string"); // или pchar(Sig)
  DestroyChanClass(ID);


 
Сергей М. ©   (2006-12-04 12:20) [19]


> Есть возможность изменить Dll?


Это ты у ее автора спрашивай)


 
Romkin ©   (2006-12-04 14:02) [20]

Надо слегка (чтобы не до смерти) ударить по голове этого маньяка-сишника, и пусть пишет к своей "dll" ActiveX обертку, с дуальными объектами, млин!


 
Сергей М. ©   (2006-12-04 14:16) [21]


> Romkin ©   (04.12.06 14:02) [20]


За что ты его так ?)

Может тот самый "маньяк-сишник" и в мыслях не имел, что какой-то там  "маньяк-дельфист" вдруг вздумает использовать его творчество "в лоб", безо всякой "артподготовки" ?)


 
clickmaker ©   (2006-12-04 14:30) [22]


> [20] Romkin ©   (04.12.06 14:02)

можно и процедурную обертку написать на том же Си++, с созданием объекта под ковром



Страницы: 1 вся ветка

Текущий архив: 2007.01.28;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.035 c
15-1168232422
Rentgen
2007-01-08 08:00
2007.01.28
Тормозят выполнения запросов SELECT в IB 7.0


2-1168690267
AlexanderMS
2007-01-13 15:11
2007.01.28
Как ProgressBar поместить на одну из панелей StatusBar?


15-1168268446
Windows
2007-01-08 18:00
2007.01.28
Помогите с задачкой


15-1167335262
Real
2006-12-28 22:47
2007.01.28
Что мешает Гуглу реализовать внутрифайловый поиск?


11-1145617791
netsend
2006-04-21 15:09
2007.01.28
KOL plugins