Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];

Вниз

Подключение 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.052 c
2-1168324858
Extar
2007-01-09 09:40
2007.01.28
Дебугер не останавливается на BP


15-1168349734
@!!ex
2007-01-09 16:35
2007.01.28
Углы Эйлера


15-1166237552
for
2006-12-16 05:52
2007.01.28
Сишные циклы FOR в Паскаль не переводятся?


15-1168324917
zdm
2007-01-09 09:41
2007.01.28
Со всеми прошедшими и наступающими!!!


2-1168356830
nordic3
2007-01-09 18:33
2007.01.28
тип TShiftState





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский