Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > dll написан в VC надо чтоб в Delphi работало


Автор: Frikazoid 26.11.2003, 21:31
Доброго времени суток Господа!
У меня возник вопрос!
Как же всё таки подключить DLL'ку написанную на VC в Delphi?

Вот фу-я:
int __declspec(dllexport) __stdcall ExtPing(int nCommPort, BOOL bIsIrDA = FALSE);

Для импорта её же я написал:
function ExtPing(nCommPort:integer; bIsIrDA:boolean=FALSE):integer; external 'Cipher.dll' name 'ExtPing';
пробовал и:
function ExtPing(nCommPort:integer; bIsIrDA:boolean):integer; external 'Cipher.dll' name 'ExtPing';
При запуске прложения дебугег говорит, что не может найти точку входа в эту вот процедуру!
В чём же моя ошибка?

Заранее благодарен за любую помощь!

ЗЫ Весь материал http://gleb.by.ru/8000_series.zip

ЗЫ 8000 Series Terminal - mazdai....

Автор: stab 26.11.2003, 21:37
попробуй так:

Код
function ExtPing(nCommPort:integer; bIsIrDA:boolean=FALSE):integer; stdcall; external 'Cipher.dll' name '?ExtPing@@YGHHH@Z';

Автор: stab 26.11.2003, 21:39
думаю тебе это поможет:

Код

CCipher::CCipher(void)
CCipher::~CCipher(void)
class CCipher & CCipher::operator=(class CCipher const &)
int CCipher::CheckComm(void)
int CCipher::ClearDatabase(int)
int CCipher::ClearDoc(int)
void CCipher::CloseComm(void)
int ExtClearDatabase(int,int,int)
int ExtClearDoc(int,int,int)
int ExtFinish(int,int)
int ExtGetCurrentState(char *,int,int)
long ExtGetDataCount(int,int,int)
long ExtGetFreeMemory(int,int)
long ExtGetRecordsCount(int,int,int)
int ExtGetSerialNumber(char *,int,int)
int ExtGetTime(char *,int,int)
int ExtPing(int,int)
int ExtPutRecord(int,char const *,int,int)
int ExtReadData(int,char *,int,int)
int ExtReadRecord(int,char *,int,int)
int ExtUpdateTime(int,int)
int CCipher::Finish(void)
int CCipher::GetCurrentState(char *)
long CCipher::GetDataCount(int)
int CCipher::GetErrorDescription(int,char *)
long CCipher::GetFreeMemory(void)
int CCipher::GetLastError(void)
long CCipher::GetRecordsCount(int)
int CCipher::GetSerialNumber(char *)
int CCipher::GetTime(char *)
int CCipher::InitComm(void)
int CCipher::OpenComm(int,int)
int CCipher::OpenIrDA(void)
int CCipher::Ping(void)
int CCipher::PutRecord(int,char const *)
int CCipher::ReadData(int,char *)
int CCipher::ReadRecord(int,char *)
int CCipher::SendCommand(char const *,char *)
int CCipher::TestIrDA(unsigned long)
int CCipher::UpdateTime(void)


Код

??0CCipher@@QAE@XZ
??1CCipher@@QAE@XZ
??4CCipher@@QAEAAV0@ABV0@@Z
?CheckComm@CCipher@@QAEHXZ
?ClearDatabase@CCipher@@QAEHH@Z
?ClearDoc@CCipher@@QAEHH@Z
?CloseComm@CCipher@@QAEXXZ
?ExtClearDatabase@@YGHHHH@Z
?ExtClearDoc@@YGHHHH@Z
?ExtFinish@@YGHHH@Z
?ExtGetCurrentState@@YGHPADHH@Z
?ExtGetDataCount@@YGJHHH@Z
?ExtGetFreeMemory@@YGJHH@Z
?ExtGetRecordsCount@@YGJHHH@Z
?ExtGetSerialNumber@@YGHPADHH@Z
?ExtGetTime@@YGHPADHH@Z
?ExtPing@@YGHHH@Z
?ExtPutRecord@@YGHHPBDHH@Z
?ExtReadData@@YGHHPADHH@Z
?ExtReadRecord@@YGHHPADHH@Z
?ExtUpdateTime@@YGHHH@Z
?Finish@CCipher@@QAEHXZ
?GetCurrentState@CCipher@@QAEHPAD@Z
?GetDataCount@CCipher@@QAEJH@Z
?GetErrorDescription@CCipher@@QAEHHPAD@Z
?GetFreeMemory@CCipher@@QAEJXZ
?GetLastError@CCipher@@QAEHXZ
?GetRecordsCount@CCipher@@QAEJH@Z
?GetSerialNumber@CCipher@@QAEHPAD@Z
?GetTime@CCipher@@QAEHPAD@Z
?InitComm@CCipher@@IAEHXZ
?OpenComm@CCipher@@QAEHHH@Z
?OpenIrDA@CCipher@@IAEHXZ
?Ping@CCipher@@QAEHXZ
?PutRecord@CCipher@@QAEHHPBD@Z
?ReadData@CCipher@@QAEHHPAD@Z
?ReadRecord@CCipher@@QAEHHPAD@Z
?SendCommand@CCipher@@IAEHPBDPAD@Z
?TestIrDA@CCipher@@IAEHK@Z
?UpdateTime@CCipher@@QAEHXZ

Автор: pascal 27.11.2003, 10:38
Очень уж любопытно, а как это вообще понимать?
то есть по какому принцепу это всё так шифруется?

Автор: Frikazoid 27.11.2003, 16:09
cully спасибо!

Автор: stab 30.11.2003, 15:30
Цитата
Очень уж любопытно, а как это вообще понимать?
то есть по какому принцепу это всё так шифруется?


Это долбаный компилер C\C++ так обзывает каждую функцию исходя из типов параметров, типа результата и, собственно, самого имени функции.

Автор: Frikazoid 5.12.2003, 16:07
Как вот это вот
Код

class CIPHER_API CCipher {
public:
//methods
BOOL OpenComm(int nCommPort, BOOL bIsIrDA = FALSE);
BOOL CheckComm();
void CloseComm();
int  GetLastError();
BOOL GetErrorDescription(int nError, LPSTR szData);
BOOL Ping();
BOOL GetSerialNumber(LPSTR szData);
BOOL GetTime(LPSTR szData);
BOOL UpdateTime();
long GetFreeMemory();
BOOL GetCurrentState(LPSTR szData);
long GetDataCount(int nDoc);
long GetRecordsCount(int nBase);
BOOL ClearDoc(int nDoc);
BOOL ClearDatabase(int nBase);
int  ReadData(int nDoc, LPSTR szData);
int  ReadRecord(int nBase, LPSTR szData);
BOOL PutRecord(int nBase, LPCSTR szData);
BOOL Finish();
//start of implementation block
CCipher(void);
//variables
HANDLE  m_hComm;
DCB   m_dcb;
OVERLAPPED m_ov;
COMSTAT m_stat;
int  m_nLastError;
int  m_nCommPort;
BOOL m_bIsIrDA;
protected:
//methods
BOOL InitComm();
BOOL OpenIrDA();
BOOL TestIrDA(DWORD spec);
BOOL ReadData(LPCSTR szCommand, LPSTR szData);
//variables
char szIrDA[16];
};

Изобразить в дельфях?
Спасибо!

Автор: oleg1973 6.12.2003, 03:43
нда smile.gif
asm
push указатель на имя dll
call loadlbrary
push указатель на кактамфункциюзовут
push eax
call getprocaddress
end;
сия хрень вернет в еах адрес той самой функ которую просили
и пофигу на чем написана dll

Автор: Frikazoid 6.12.2003, 11:16
да нет!
Мне нужно тот класс экспортнуть!

Автор: Frikazoid 7.12.2003, 13:27
Ну поможите плз!

Автор: stab 7.12.2003, 22:42
почитай здесь: http://forum.vingrad.ru/index.php?act=ST&f=2&t=13274

Автор: Frikazoid 8.12.2003, 15:06
Ну да, помню помню! но тогда я так и не получил нужного мне ответа!

Автор: stab 8.12.2003, 18:59
а в чем проблема? что конкретно не получается?

Автор: Frikazoid 8.12.2003, 21:07
Ну переведи мне ПЛЗ в дельфёвый вид этот класс. И всё! ПЛЗ!

Автор: Dmitry V.Abramov 8.12.2003, 23:21
Frikazoid Классы в каждом языке устроены по-разному. В Delphi и BCB постарались сделать их максимально схожими. И то, нет-нет да слышен вскрик наступившего на очередные грабли несовместимости. Про бинарный перенос классов из MSVC слышать пока не приходилось. Либо proxy-DLL, либо полухакерская адаптация, если для нее оставлены лазейки (как, например, поступили ребята с классами из GDI+).

Об этом ведь уже писалось. Причем именно по твоему вопросу. Причем подробно и с вариантами решений.

Автор: Frikazoid 9.12.2003, 00:08
короче засада!
Я уже вот месяц или больше как бьюсь об эту х...ю

Автор: stab 9.12.2003, 19:33
Frikazoid, покажи свои наброски ;)

Автор: Frikazoid 9.12.2003, 21:51
Да какие там наброски? Там есть функции, специально предназначенные для использования без применение того самого класса. Они все с префиксом ext, но они все возращают -1! Я не понимаю почему! А с классом я не пробовал!

Автор: Frikazoid 12.1.2004, 18:37
Здрасти!
Могёте вот это перевести в дельфёвый вид культурно на? Спасибо!
int __declspec(dllexport) __stdcall ExtPing(int nCommPort, BOOL bIsIrDA = FALSE);
long __declspec(dllexport) __stdcall ExtGetFreeMemory(int nCommPort, BOOL bIsIrDA = FALSE);
BOOL __declspec(dllexport) __stdcall ExtGetSerialNumber(LPSTR szData, int nCommPort, BOOL bIsIrDA = FALSE);
BOOL __declspec(dllexport) __stdcall ExtGetTime(LPSTR szData, int nCommPort, BOOL bIsIrDA = FALSE);
BOOL __declspec(dllexport) __stdcall ExtUpdateTime(int nCommPort, BOOL bIsIrDA = FALSE);

int __declspec(dllexport) __stdcall ExtGetCurrentState(LPSTR szData, int nCommPort, BOOL bIsIrDA = FALSE);
long __declspec(dllexport) __stdcall ExtGetDataCount(int nDoc, int nCommPort, BOOL bIsIrDA = FALSE);
long __declspec(dllexport) __stdcall ExtGetRecordsCount(int nBase, int nCommPort, BOOL bIsIrDA = FALSE);
BOOL __declspec(dllexport) __stdcall ExtClearDoc(int nDoc, int nCommPort, BOOL bIsIrDA = FALSE);
BOOL __declspec(dllexport) __stdcall ExtClearDatabase(int nBase, int nCommPort, BOOL bIsIrDA = FALSE);
int __declspec(dllexport) __stdcall ExtReadData(int nDoc, LPSTR szData, int nCommPort, BOOL bIsIrDA = FALSE);
int __declspec(dllexport) __stdcall ExtReadRecord(int nBase, LPSTR szData, int nCommPort, BOOL bIsIrDA = FALSE);
BOOL __declspec(dllexport) __stdcall ExtPutRecord(int nBase, LPCSTR szData, int nCommPort, BOOL bIsIrDA = FALSE);
BOOL __declspec(dllexport) __stdcall ExtFinish(int nCommPort, BOOL bIsIrDA = FALSE);

Санькс...

Автор: Frikazoid 12.1.2004, 23:16
Ну плиз!

Автор: Unregistered 17.2.2004, 12:33
... прошло два года...

Ребята всё это фигня чё вы тут написали. Подстава в том что __declspec(dllexport) почему-то не работает. Чтобы получить результат необходимо ручками написать def-файл.

Автор: Frikazoid 17.2.2004, 12:54
В другой теме ответ!
Теперь всё работает! Вот тока траблы с получением данных из Pchar овых полей!

Автор: Unregistered 19.2.2004, 11:17
Frikazoid
Если не трудно кинь ссылку где ответ нашел. У меня тот же трабл. Уже 2 недели ничего не могу сделать.

Автор: <Spawn> 19.2.2004, 12:22
Unregistered возьми любую прогу, умеющую смотреть PE-заголовок и увидишь реальные имена функций.

Автор: AlexD 19.2.2004, 12:29
<Spawn>
Заголовки я ужо узал два дня назад. У меня так же как и у Frikazoida при использовании функций возникает External Exception.

Автор: AlexD 19.2.2004, 12:30
Кстати работаю в CBuilder, но смысл я думаю тотже.

Автор: Frikazoid 19.2.2004, 13:14
Дык! То тоже моя тема с этим же вопросом! Просто воспользуйся поиском по моему имени! у меня мало тем!

Автор: AlexD 19.2.2004, 14:35
Frikazoid
А как именно сделал? Я скачал то что man2002ua прислал, там его dll и проект на делфях, так не пашет он у меня нихрена. Порт открывается а пинг не проходит.

Автор: AlexD 20.2.2004, 06:21
Frikazoid
Огромная просьба, пришли пожалуйста исходник где хотябы Ping проходит.
Порт у меня открывается и закрывается, это единственное что работает.
alex@tomladcsh.tomsknet.ru

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)