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

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

Подключение DLL написаной на VC++ в проекте Delphi [D7, WinXP]


Страницы:   1 2

LexusU ©   (2006-12-01 14:39:00) 

Имеются библиотеки написанные на 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-04 14:30:00) [1]


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

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


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


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


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

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


Romkin   (2006-12-04 14:02:00) [3]

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


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


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


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


DevilDevil   (2006-12-04 12:17:00) [5]

Есть возможность изменить 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);


oxffff   (2006-12-04 12:08:00) [6]

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


oxffff   (2006-12-04 12:00:00) [7]


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


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


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


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


Не возражаю)


Anatoly Podgoretsky   (2006-12-04 11:16:00) [9]

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

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


Anatoly Podgoretsky   (2006-12-04 11:15:00) [10]

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

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


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


> LexusU   (04.12.06 10:54) [11]


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


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

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

 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 10:50:00) [13]


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


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


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

Немного я в постновке задачи ошибся наверное. Библиотека с помощью классов написана. Вообщем вот что разрабочик библиотеки пишет(но это для использования библиотеки в том же 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 надо класс объявлять, и через него работать?


palva   (2006-12-04 10:41:00) [15]

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


evvcom   (2006-12-04 09:20:00) [16]

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

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


Desdechado   (2006-12-01 18:50:00) [17]

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


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


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

PChar либо const PChar


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

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

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


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


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


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


Страницы:   1 2

Наверх

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