![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подключение DLL написаной на VC++ в проекте Delphi [D7, WinXP]
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 не найдена.
Это значит только одно - не найдена.
Т.е. нет в этом РЕ-модуле интересующего экспортируемого имени.