Форум: "Основная";
Текущий архив: 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.05 c