|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
Author |
Message |
aav8
Maniac
Joined: 05 Nov 2008 19:47 Posts: 287 Location: 81.28.208.238
|
Сейчас думаю насчет переходников... Но придется декорировать каждую функцию.
В VS открыл окно дизассемблера.
|
19 Nov 2012 19:12 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Намекни - что надо делать: я тоже подмогну!
Скромно! И со вкусом! А я уж хотел подключить Soft-Ice... Только у меня
сравнивать было не с чем, да и не пробовал я отслеживать ничего, кроме
вызовов Win API.
_________________ iLavr
|
19 Nov 2012 19:25 |
|
|
aav8
Maniac
Joined: 05 Nov 2008 19:47 Posts: 287 Location: 81.28.208.238
|
... authorize отработало ...
Потом ест-но все зависло.
Буду копать дальше...
|
19 Nov 2012 22:41 |
|
|
aav8
Maniac
Joined: 05 Nov 2008 19:47 Posts: 287 Location: 81.28.208.238
|
добрался до
MyDsimModel::setup
напрвление вроде правильное..
|
20 Nov 2012 02:42 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Ты бы, может, показал бы кусочек этого кода?
Или - оффсет к нему... я бы тоже прочитать попробовал...
А то я не делаю ничего... А ты там - в одиночку...
_________________ iLavr
|
20 Nov 2012 10:33 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Чем-то напоминает __fastcall: Два первых параметра в регистрах ECX и EDX, остальные - в стек, справа налево. Чистит стек сама функция. Если только ECX, то похоже на thiscall:
PS. Это я пытаюсь найти информацию - нет ли возможности "заставить" Борланд Билдер делать вызовы так, как нам требуется...
_________________ iLavr
|
20 Nov 2012 14:47 |
|
|
aav8
Maniac
Joined: 05 Nov 2008 19:47 Posts: 287 Location: 81.28.208.238
|
Я думаю тоже что это fascall но от VS - какой-то в их стандерте. Обязательно будет - когда определюсь со схемой. Сейчас примерно такая схема: будет *.DLL которую нужно будет линковать к своей DLL. И *.HPP для вего. Классы для модели с префиксом "t". а все остальное практически прозрачно. Пришли письмо на [мой ник] с двумя цифрами на мыло .ru я отправлю исходники и DLL.
если есть студия можешь по яналогии сам допилить
немножко время есть вот и занимаюсь.
да и здорово плюсы покопать и заодно вспомнить студию
|
20 Nov 2012 16:51 |
|
|
aav8
Maniac
Joined: 05 Nov 2008 19:47 Posts: 287 Location: 81.28.208.238
|
Примерно вот так будет выглядеть...
Остальное в идеале не изменится или немного.
Но если пишешь код с нуля, разницы я думаю нет.
Скорее всего оно.
Ест-но Borland этого не знает.
И это не красиво со стороны Proteus.
|
20 Nov 2012 19:32 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Если я правильно тебя понял - дополнительная *.DLL будет " переделывать" соглашение о вызове на " корректное" для данной ситуации с Протеусом? По поводу кода - я просил - подскажи, как выглядит типичный код вызова виртуальной функции - я тоже в дизассемблере хотел покопаться... Он мне куда ближе, нежели С++.
Скорее всего это не злонамеренно. Proteus - написали на MS Visual C++, отсюда
и такие соглашения.
Я пообщался с джентльменами на kazus.ru, они говорят, что DLL для Proteus спокойно
и без проблем компилятся ещё на MS Visual C++ 5.0.
А это и был как раз тот момент, когда я сделал свой выбор в пользу Borland C++ Builder.
_________________ iLavr
|
21 Nov 2012 11:08 |
|
|
aav8
Maniac
Joined: 05 Nov 2008 19:47 Posts: 287 Location: 81.28.208.238
|
VS | | | | Code: extern "C" IDSIMMODEL __declspec (dllexport) *createdsimmodel (CHAR *device, ILICENCESERVER *ils) { 10012850 push ebp 10012851 mov ebp,esp 10012853 sub esp,0C0h 10012859 push ebx 1001285A push esi 1001285B push edi 1001285C lea edi,[ebp-0C0h] 10012862 mov ecx,30h 10012867 mov eax,0CCCCCCCCh 1001286C rep stos dword ptr es:[edi]
ils->authorize(0x5555,0xAAAA); 1001286E mov esi,esp 10012870 push 0AAAAh 10012875 push 5555h 1001287A mov eax,dword ptr [ils] 1001287D mov edx,dword ptr [eax] 1001287F mov ecx,dword ptr [ils] 10012882 mov eax,dword ptr [edx] 10012884 call eax 10012886 cmp esi,esp 10012888 call @ILT+390(__RTC_CheckEsp) (1001118Bh) return NULL; | | | | |
BC а это чем тестировал | | | | Code: int _stdcall WinMain(HINSTANCE,HINSTANCE,char*,int) {
LS *oo=new LS;
oo->authorize(0xAA,0x55); oo->aa(0xAA,0x55);
HINSTANCE L; bool (*Proc)(char*,void*); // F=(void(*)(char*,void*))Proc;
//*************
L=LoadLibrary("E:\\VSM\\vs\\Debug\\OneWireDebugger.dll"); Proc=(bool(*)(char*,void*))GetProcAddress(L,"createdsimmodel"); (*Proc)("hello",&oLS);
//*************
L=LoadLibrary("E:\\VSM\\bc-00001\\onewiredebugger.dll"); Proc=(bool(*)(char*,void*))GetProcAddress(L,"createdsimmodel"); (*Proc)("hello",&oLS);
//*************
FreeLibrary(L);
return 0;
} | | | | |
в VS настроек никаких не делал - все по умолчанию. код Borlanda мне больше понравился. еще-бы они явно указали способ вызова... Я думаю это должно быть одним из правил для описания своего интерфейса. Да. Эту DLL нужно будет положить в Proteus или куда указывает path В каталоги с моделями почемуто не прокатывает - но чесно говоря с этим особо не разбирался. Ну и #include примерно такой но его еще пилить и пилить... | | | | Code: /*** 20-11-2012 ******************** aav@lora.nsk.su Алексеев А.В. *** * Переходние для Proteus * ********************************************************************/
#ifndef _tVSM_HPP_
#include "VSM.HPP"
/********************************************************************/
//tILICENCESERVER
/*** 20-11-2012 ******************** aav@lora.nsk.su Алексеев А.В. *** * IDSIMMODEL * ********************************************************************/
class ttIDSIMMODEL;
class tIDSIMMODEL {
public:
//virtual INT isdigital (CHAR *pinname) = 0; virtual INT _stdcall isdigital (CHAR *pinname) = 0; //virtual VOID setup (IINSTANCE *instance, IDSIMCKT *dsim) = 0; virtual VOID _stdcall setup (IINSTANCE *instance, IDSIMCKT *dsim) = 0; //virtual VOID runctrl (RUNMODES mode) = 0; virtual VOID _stdcall runctrl (RUNMODES mode) = 0; //virtual VOID actuate (REALTIME time, ACTIVESTATE newstate) = 0; virtual VOID _stdcall actuate (REALTIME time, ACTIVESTATE newstate) = 0; //virtual BOOL indicate (REALTIME time, ACTIVEDATA *newstate) = 0; virtual BOOL _stdcall indicate (REALTIME time, ACTIVEDATA *newstate) = 0; //virtual VOID simulate (ABSTIME time, DSIMMODES mode) = 0; virtual VOID _stdcall simulate (ABSTIME time, DSIMMODES mode) = 0; //virtual VOID callback (ABSTIME time, EVENTID eventid) = 0; virtual VOID _stdcall callback (ABSTIME time, EVENTID eventid) = 0;
ttIDSIMMODEL* tt;
};
class ttIDSIMMODEL : private IDSIMMODEL {
public:
ttIDSIMMODEL(tIDSIMMODEL*); ~ttIDSIMMODEL(void);
virtual INT isdigital (CHAR *pinname); virtual VOID setup (IINSTANCE *instance, IDSIMCKT *dsim); virtual VOID runctrl (RUNMODES mode); virtual VOID actuate (REALTIME time, ACTIVESTATE newstate); virtual BOOL indicate (REALTIME time, ACTIVEDATA *newstate); virtual VOID simulate (ABSTIME time, DSIMMODES mode); virtual VOID callback (ABSTIME time, EVENTID eventid);
private:
tIDSIMMODEL* t;
};
extern "C" IDSIMMODEL* _stdcall newIDSIMMODEL(tIDSIMMODEL*); extern "C" void _stdcall deleteIDSIMMODEL(tIDSIMMODEL*);
/*** 20-11-2012 ******************** aav@lora.nsk.su Алексеев А.В. *** * ILICENCESERVER * ********************************************************************/
class ttILICENCESERVER {
public:
_stdcall ttILICENCESERVER(ILICENCESERVER* ils) { tLS=ils; };
//virtual BOOL authorize (DWORD product_id, DWORD apiver=VSM_API_VERSION); virtual BOOL _stdcall authorize (DWORD product_id, DWORD apiver=VSM_API_VERSION); //virtual BOOL authorizeex (DWORD product_id, DWORD apiver=VSM_API_VERSION, DWORD builddate=VSM_BUILD_DATE); virtual BOOL _stdcall authorizeex (DWORD product_id, DWORD apiver=VSM_API_VERSION, DWORD builddate=VSM_BUILD_DATE); //virtual DWORD getid(); virtual DWORD _stdcall getid(); //virtual CHAR* getname(); virtual CHAR* _stdcall getname(); //virtual CHAR* getcompany(); virtual CHAR* _stdcall getcompany(); //virtual CHAR* getexpirydate(); virtual CHAR* _stdcall getexpirydate();
private:
ILICENCESERVER* tLS;
};
extern "C" ttILICENCESERVER* _stdcall newILICENCESERVER( ILICENCESERVER*); extern "C" void _stdcall deleteILICENCESERVER(ttILICENCESERVER*);
class tILICENCESERVER {
public: _stdcall tILICENCESERVER(ILICENCESERVER* ils) { t= newILICENCESERVER(ils); } _stdcall ~tILICENCESERVER(void) { deleteILICENCESERVER(t); }
ttILICENCESERVER* t;
};
/*** 20-11-2012 ******************** aav@lora.nsk.su Алексеев А.В. *** * Инициализация переходников * ********************************************************************/
/********************************************************************/
#define _tVSM_HPP_ #endif _tVSM_HPP_
/*** END ************************************************************/
| | | | |
|
21 Nov 2012 18:46 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Спасибо за намётки - у меня тоже есть желание подробнее с этим разобраться!
На работе, оказалось, есть Студия 2008 - я подсунул ей исходники от kazus.ru
ничего не меняя, она сразу изругалась:
" Заголовочный файл ... от устаревшей версии Студии или от С"
разбираться на работе сегодня уже было некогда.
Заодно я решил проверить вот этот вариант:
" VCToolkit от Microsoft (бесплатный C++ компилятор командной строки, совместимый с .NETовским) и утилиты nmake.exe того же производителя.".
Вчера скачал VCToolkitSetup.exe - он сравнительно небольшой: 31.40 МБайт.
И NMAKE15.exe тоже скачал...
Правда работать с компилятором из командной строки я ранее не пробовал, придётся
мануалы покурить, в том числе и на MAKE-файлы...
Но мне кажется, VS компилятор придётся завести - я уже не первый раз подолгу
перетаскиваю VC++ проекты под Builder. И не всегда удачно...
_________________ iLavr
|
22 Nov 2012 10:16 |
|
|
aav8
Maniac
Joined: 05 Nov 2008 19:47 Posts: 287 Location: 81.28.208.238
|
Ну и замечательно.
Ей нужно скормить этот файл:
| | | | Code: #include <windows.h>
#include "tVSM.hpp"
extern "C" IDSIMMODEL* _stdcall newIDSIMMODEL(tIDSIMMODEL* i) { return (IDSIMMODEL*)new ttIDSIMMODEL(i); }
extern "C" void _stdcall deleteIDSIMMODEL(tIDSIMMODEL* i) { delete i->tt; // delete i; }
ttIDSIMMODEL::ttIDSIMMODEL(tIDSIMMODEL* i) { t=i; }
ttIDSIMMODEL::~ttIDSIMMODEL(void) { delete t; }
INT ttIDSIMMODEL::isdigital (CHAR *pinname) { return t->isdigital(pinname); }
VOID ttIDSIMMODEL::setup (IINSTANCE *instance, IDSIMCKT *dsim) { t->setup (instance,dsim); }
VOID ttIDSIMMODEL::runctrl(RUNMODES mode) { t->runctrl (mode); }
VOID ttIDSIMMODEL::actuate (REALTIME time, ACTIVESTATE newstate) { t->actuate (time,newstate); } BOOL ttIDSIMMODEL::indicate (REALTIME time, ACTIVEDATA *newstate) { return t->indicate (time,newstate); } VOID ttIDSIMMODEL::simulate (ABSTIME time, DSIMMODES mode) { t->simulate (time,mode); } VOID ttIDSIMMODEL::callback (ABSTIME time, EVENTID eventid) { t->callback (time,eventid); }
//*************
ttILICENCESERVER* _stdcall newILICENCESERVER(ILICENCESERVER* ils) { return new ttILICENCESERVER(ils); }
void _stdcall deleteILICENCESERVER(ttILICENCESERVER* tls) { delete (tls); }
BOOL _stdcall ttILICENCESERVER::authorize (DWORD product_id, DWORD apiver) { return tLS->authorize (product_id,apiver); }
BOOL _stdcall ttILICENCESERVER::authorizeex (DWORD product_id, DWORD apiver, DWORD builddate) { return tLS->authorizeex (product_id,apiver,builddate); }
DWORD _stdcall ttILICENCESERVER::getid() { return tLS->getid(); }
CHAR* _stdcall ttILICENCESERVER::getname() { return tLS->getname(); } CHAR* _stdcall ttILICENCESERVER::getcompany() { return tLS->getcompany(); } CHAR* _stdcall ttILICENCESERVER::getexpirydate() { return tLS->getexpirydate(); }
| | | | |
И получить DLL. HPP файл я уже выкладывал. А это кусок из примера про 1-Wire С исправлениями для Borland-а MyDsimModel.h | | | | Code: #pragma once #include "StdAfx.h" //#include "vsm.hpp" //aav- #include "tVSM.hpp" //aav+
//class MyDsimModel : public IDSIMMODEL //aav- class MyDsimModel : public tIDSIMMODEL //aav+ { public:
MyDsimModel(void); //aav+
// INT isdigital (CHAR *pinname); //aav- INT _stdcall isdigital (CHAR *pinname); //aav+ // VOID setup (IINSTANCE *inst, IDSIMCKT *dsim); //aav- VOID _stdcall setup (IINSTANCE *inst, IDSIMCKT *dsim); //aav+ // VOID runctrl (RUNMODES mode); //aav- VOID _stdcall runctrl (RUNMODES mode); //aav+ // VOID actuate (REALTIME time, ACTIVESTATE newstate); VOID _stdcall actuate (REALTIME time, ACTIVESTATE newstate); // BOOL indicate (REALTIME time, ACTIVEDATA *data); BOOL _stdcall indicate (REALTIME time, ACTIVEDATA *data); // VOID simulate (ABSTIME time, DSIMMODES mode); VOID _stdcall simulate (ABSTIME time, DSIMMODES mode); // VOID callback (ABSTIME time, EVENTID eventid); VOID _stdcall callback (ABSTIME time, EVENTID eventid); private: IINSTANCE *inst; IDSIMCKT *ckt; IDSIMPIN *PinI1W; // Пин I1W LONGLONG prev_time; // Предыдущее время BOOL prev_st; // Предыдущее состояние пина I1W IDEBUGPOPUP *myPopup; BYTE imode; // Режим: // 0 - ожидание RESET // 1 - RESET получили, ожидание PRESENCE BYTE byt; // Байт, считанный с линии BYTE num_bit; // Номер бита BYTE kolvo; // Сколько байт будем передавать/принимать BYTE cmnd; // Последняя команда };
| | | | |
И кусок MyDsimModel.cpp | | | | Code: #include "StdAfx.h" #include "MyDsimModel.h"
//aav+ {
//_stdcall tIDSIMMODEL::tIDSIMMODEL(void) { // //}
//aav+ }
MyDsimModel::MyDsimModel(void) { //aav+ MessageBox(0,"constructor","VSM",0); //aav+ } //aav+
//INT MyDsimModel::isdigital (CHAR *pinname) { //aav+ // MessageBox(0,"isdigital K","VSM",0); //aav+ // return 1; // У модели все выводы цифровые //aav+ //} //aav+
//INT MyDsimModel::isdigital (CHAR *pinname) //aav- INT _stdcall MyDsimModel::isdigital (CHAR *pinname) //aav+ {
MessageBox(0,"isdigital T","VSM",0); //aav+
return 1; // У модели все выводы цифровые }
//VOID MyDsimModel::setup (IINSTANCE *instance, IDSIMCKT *dsimckt) //aav- VOID _stdcall MyDsimModel::setup (IINSTANCE *instance, IDSIMCKT *dsimckt) //aav+ { MessageBox(0,"setup","VSM",0);
inst = instance; ckt = dsimckt; PinI1W = inst->getdsimpin("I1W", true); // Связываем переменную с пином I1W prev_time = 0;
CREATEPOPUPSTRUCT *cps = new CREATEPOPUPSTRUCT; cps->caption = "1-wire Debugger Log"; // Заголовок окна cps->flags = PWF_VISIBLE; // Видимое окно cps->type = PWT_DEBUG; // Тип окна - DEBUG cps->height = 500; // Высота окна cps->width = 300; // Ширина окна cps->id = 123; // Идентификатор окна
myPopup = (IDEBUGPOPUP *)instance->createpopup(cps);
| | | | |
|
22 Nov 2012 18:02 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Это теперь придётся отложить до понедельника...
Дома компилятор командной строки VCToolkit 2003 - не установился...
Долго шуршал винтом, а потом сказал, что:
" Не может создать .NET фреймворк, поскольку хочет IE 5.01"
Был удивлён непомерно... ну нафига строковому компиллеру какой-либо IE в принципе!
Сейчас думаю попробовать поставить дома вновь VS 5.0 и попробовать урезать её
до компилятора из командной строки с утилитой make.
В принципе VS 5.0 и была у меня параллельно с Борландом 5.0, и даже ошмётки
свои она оставила:
C:\Program Files\DevStudio\VC\bin
_________________ iLavr
|
23 Nov 2012 02:22 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Почитал я внимательно все материалы, и если я правильно понял, основная идея такая:
сконструированная тобой DLL должна быть скомпилированна в MS Vizual Studio,
поскольку она воспринимает "неправильные" вызовы Билдера и переадресует их
в Proteus - уже по собственному "правильному" соглашению.
А вызовы из кода Билдера в Proteus мы перенаправляем сначала в эту твою DLL,
которая по сути - конвертор соглашений вызова.
То есть, по-любому одну DLL придётся скомпилировать средствами MS Vizual Studio.
И у меня вот вопрос возник, раз уж мы залезли в код и знаем, как делают свои вызовы
как Билдер, так и MS Vizual Studio, не будет ли проще записать эти вызовы в коде
программы Билдера просто на ассемблере?
_________________ iLavr
|
23 Nov 2012 07:17 |
|
|
aav8
Maniac
Joined: 05 Nov 2008 19:47 Posts: 287 Location: 81.28.208.238
|
Конешно можно, но тогда на ассемблере придется писать
все такие функции
или пропускать их через переходник на ассемблере.
А как принимать вызовы из Proteusa сразу и не придумать...
|
23 Nov 2012 13:27 |
|
|
Who is online |
Users browsing this forum: Google [Bot] and 49 guests |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum
|
|