nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 31 Mar 2020 03:20



Reply to topic  [ 306 posts ]  Go to page Previous  1, 2, 3, 4, 5, 6, 7 ... 21  Next
Proteus C++ DLL's 
Author Message
Maniac

Joined: 05 Nov 2008 20:47
Posts: 268
Location: 81.28.208.238
Reply with quote
Post 
Quote:
А мы никак не сможем это подправить или обойти?

Сейчас думаю насчет переходников...
Но придется декорировать каждую функцию.

Quote:
PS. А что ты юзал в качестве "микроскопа"?

В VS открыл окно дизассемблера.


19 Nov 2012 20:12
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Post 
aav8 wrote:
Сейчас думаю насчет переходников...
Но придется декорировать каждую функцию.

Намекни - что надо делать: я тоже подмогну!


aav8 wrote:
Quote:
PS. А что ты юзал в качестве "микроскопа"?

В VS открыл окно дизассемблера.

Скромно! И со вкусом! А я уж хотел подключить Soft-Ice... :lol: Только у меня
сравнивать было не с чем, да и не пробовал я отслеживать ничего, кроме
вызовов Win API.

_________________
iLavr


19 Nov 2012 20:25
Profile
Maniac

Joined: 05 Nov 2008 20:47
Posts: 268
Location: 81.28.208.238
Reply with quote
Post 
... authorize отработало ...
Потом ест-но все зависло.
Буду копать дальше...


19 Nov 2012 23:41
Profile
Maniac

Joined: 05 Nov 2008 20:47
Posts: 268
Location: 81.28.208.238
Reply with quote
Post 
добрался до
MyDsimModel::setup
напрвление вроде правильное..


20 Nov 2012 03:42
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Post 
aav8 wrote:
Поэтому когда мы вызываем из Borlandа Proteus,
му ему передаем в authorize два параметра и ссылку на
объект (в стеке), а Proteus ждет два параметра в стеке, и
ссылку на объект в регистрах.

Ты бы, может, показал бы кусочек этого кода?
Или - оффсет к нему... я бы тоже прочитать попробовал...

А то я не делаю ничего... :( А ты там - в одиночку... :-?

_________________
iLavr


20 Nov 2012 11:33
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Post 
aav8 wrote:
VS тоже кладет парвметры в стек, а ссылку на объект
запихивает в регистр ECX и/или EDX - точно еще не понял.

Чем-то напоминает __fastcall:
Два первых параметра в регистрах ECX и EDX, остальные - в стек, справа налево.
Чистит стек сама функция.
Code:
_fastcall: ; аналогично stdcall, но два первых параметра передаются через регистры
  push D
  push C
  mov edx, B
  mov eax, A
  call F
  ; ret 8 ; очистка стека - в функции


Если только ECX, то похоже на thiscall:
Quote:
Указатель this передается в регистре ECX, параметры в стек, справа налево.
Чистит стек сама функция.
Применяется функциями-методами классов без списка аргументов переменной
длины. Не может быть задан явно.




PS. Это я пытаюсь найти информацию - нет ли возможности "заставить" Борланд Билдер
делать вызовы так, как нам требуется...

_________________
iLavr


20 Nov 2012 15:47
Profile
Maniac

Joined: 05 Nov 2008 20:47
Posts: 268
Location: 81.28.208.238
Reply with quote
Post 
Quote:
Чем-то напоминает __fastcall

Я думаю тоже что это fascall но от VS - какой-то в их стандерте.
Quote:
Ты бы, может, показал бы кусочек этого кода?
Или - оффсет к нему... я бы тоже прочитать попробовал...

Обязательно будет - когда определюсь со схемой.
Сейчас примерно такая схема:
будет *.DLL которую нужно будет линковать к своей DLL.
И *.HPP для вего.
Классы для модели с префиксом "t".
а все остальное практически прозрачно.
Пришли письмо на [мой ник] с двумя цифрами на мыло .ru я отправлю
исходники и DLL.
Quote:
А ты там - в одиночку...

если есть студия можешь по яналогии сам допилить
немножко время есть вот и занимаюсь.
да и здорово плюсы покопать и заодно вспомнить студию


20 Nov 2012 17:51
Profile
Maniac

Joined: 05 Nov 2008 20:47
Posts: 268
Location: 81.28.208.238
Reply with quote
Post 
Code:
#include "stdafx.h"
//#include "vsm.hpp" //aav-
#include "tVSM.hpp" //aav+
#include "MyActiveModel.h"
#include "MyDsimModel.h"

#define OneWireDebugger_Key 0x00000000


extern "C" IDSIMMODEL __declspec (dllexport) *createdsimmodel (CHAR *device, ILICENCESERVER *ils)
extern "C" IDSIMMODEL thiscall (dllexport) *createdsimmodel (CHAR *device, ILICENCESERVER *ils)
{

  tILICENCESERVER tLS(ils); //aav+

//  tLS->authorize(OneWireDebugger_Key); //aav+

//   if (ils->authorize(OneWireDebugger_Key)) //aav-
   if (tLS.t->authorize(OneWireDebugger_Key)) { //aav+
      MessageBox(0,"authorize","VSM",0); //aav+
//      return new MyDsimModel; //aav-
      return newIDSIMMODEL(new MyDsimModel); //aav+
//      return NULL;
   } else {
      return NULL;
   }

}

extern "C" VOID __declspec (dllexport) deletedsimmodel (IDSIMMODEL *model)
{
//   delete (MyDsimModel *)model; //aav-
   deleteIDSIMMODEL((MyDsimModel *)model); //aav-
}

Примерно вот так будет выглядеть...
Остальное в идеале не изменится или немного.
Но если пишешь код с нуля, разницы я думаю нет.


Quote:
Если только ECX, то похоже на thiscall:

Скорее всего оно.
Ест-но Borland этого не знает.
И это не красиво со стороны Proteus.


20 Nov 2012 20:32
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Post 
aav8 wrote:
Сейчас примерно такая схема:
будет *.DLL которую нужно будет линковать к своей DLL.
...
Классы для модели с префиксом "t".

Если я правильно тебя понял - дополнительная *.DLL будет "переделывать"
соглашение о вызове на "корректное" для данной ситуации с Протеусом?

По поводу кода - я просил - подскажи, как выглядит типичный код вызова
виртуальной функции - я тоже в дизассемблере хотел покопаться...
Он мне куда ближе, нежели С++.

aav8 wrote:
Ест-но Borland этого не знает.
И это не красиво со стороны Proteus.

Скорее всего это не злонамеренно. Proteus - написали на MS Visual C++, отсюда
и такие соглашения.
Я пообщался с джентльменами на kazus.ru, они говорят, что DLL для Proteus спокойно
и без проблем компилятся ещё на MS Visual C++ 5.0.
А это и был как раз тот момент, когда я сделал свой выбор в пользу Borland C++ Builder.

_________________
iLavr


21 Nov 2012 12:08
Profile
Maniac

Joined: 05 Nov 2008 20:47
Posts: 268
Location: 81.28.208.238
Reply with quote
Post 
Quote:
По поводу кода - я просил - подскажи, как выглядит типичный код вызова

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:
003B118B  push        ebp 
003B118C  mov         ebp,esp 
003B118E  push        0AAAAh 
003B1193  push        5555h 
003B1198  mov         eax,dword ptr [ebp+0Ch] 
003B119B  push        eax 
003B119C  mov         edx,dword ptr [eax] 
003B119E  call        dword ptr [edx] 
003B11A0  xor         eax,eax 
003B11A2  pop         ebp 
003B11A3  ret         8 

а это чем тестировал
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 мне больше понравился.
Quote:
Скорее всего это не злонамеренно. Proteus - написали на MS Visual C++, отсюда
и такие соглашения

еще-бы они явно указали способ вызова...
Я думаю это должно быть одним из правил для описания своего интерфейса.
Quote:
Если я правильно тебя понял - дополнительная *.DLL будет "переделывать"
соглашение о вызове на "корректное" для данной ситуации с Протеусом?

Да.
Эту 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 19:46
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Спасибо за намётки - у меня тоже есть желание подробнее с этим разобраться!

aav8 wrote:
если есть студия можешь по яналогии сам допилить.

На работе, оказалось, есть Студия 2008 - я подсунул ей исходники от kazus.ru
ничего не меняя, она сразу изругалась:
"Заголовочный файл ... от устаревшей версии Студии или от С"
разбираться на работе сегодня уже было некогда.

Заодно я решил проверить вот этот вариант:
"VCToolkit от Microsoft (бесплатный C++ компилятор командной строки, совместимый
с .NETовским) и утилиты nmake.exe того же производителя.
".

Вчера скачал VCToolkitSetup.exe - он сравнительно небольшой: 31.40 МБайт.
И NMAKE15.exe тоже скачал...

Правда работать с компилятором из командной строки я ранее не пробовал, придётся
мануалы покурить, в том числе и на MAKE-файлы...
Но мне кажется, VS компилятор придётся завести - я уже не первый раз подолгу
перетаскиваю VC++ проекты под Builder. И не всегда удачно...

_________________
iLavr


22 Nov 2012 11:16
Profile
Maniac

Joined: 05 Nov 2008 20:47
Posts: 268
Location: 81.28.208.238
Reply with quote
Post 
Quote:
На работе, оказалось, есть Студия 2008

Ну и замечательно.
Ей нужно скормить этот файл:
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 19:02
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Post 
aav8 wrote:
Quote:
На работе, оказалось, есть Студия 2008

Ну и замечательно.
Ей нужно скормить этот файл:
Code:
#include <windows.h>
...

Это теперь придётся отложить до понедельника...

Дома компилятор командной строки VCToolkit 2003 - не установился... :(
Долго шуршал винтом, а потом сказал, что:
"Не может создать .NET фреймворк, поскольку хочет IE 5.01"

Был удивлён непомерно... ну нафига строковому компиллеру какой-либо IE в принципе! :o

Сейчас думаю попробовать поставить дома вновь VS 5.0 и попробовать урезать её
до компилятора из командной строки с утилитой make.
В принципе VS 5.0 и была у меня параллельно с Борландом 5.0, и даже ошмётки
свои она оставила:
C:\Program Files\DevStudio\VC\bin

_________________
iLavr


23 Nov 2012 03:22
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Почитал я внимательно все материалы, и если я правильно понял, основная идея такая:
сконструированная тобой DLL должна быть скомпилированна в MS Vizual Studio,
поскольку она воспринимает "неправильные" вызовы Билдера и переадресует их
в Proteus - уже по собственному "правильному" соглашению.

А вызовы из кода Билдера в Proteus мы перенаправляем сначала в эту твою DLL,
которая по сути - конвертор соглашений вызова.

То есть, по-любому одну DLL придётся скомпилировать средствами MS Vizual Studio.

И у меня вот вопрос возник, раз уж мы залезли в код и знаем, как делают свои вызовы
как Билдер, так и MS Vizual Studio, не будет ли проще записать эти вызовы в коде
программы Билдера просто на ассемблере?

_________________
iLavr


23 Nov 2012 08:17
Profile
Maniac

Joined: 05 Nov 2008 20:47
Posts: 268
Location: 81.28.208.238
Reply with quote
Post 
Quote:
И у меня вот вопрос возник, раз уж мы залезли в код и знаем, как делают свои вызовы
как Билдер, так и MS Vizual Studio, не будет ли проще записать эти вызовы в коде
программы Билдера просто на ассемблере?

Конешно можно, но тогда на ассемблере придется писать
все такие функции
Code:
  if (ils->authorize(OneWireDebugger_Key))


или пропускать их через переходник на ассемблере.
А как принимать вызовы из Proteusa сразу и не придумать...


23 Nov 2012 14:27
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 306 posts ]  Go to page Previous  1, 2, 3, 4, 5, 6, 7 ... 21  Next

Who is online

Users browsing this forum: No registered users and 2 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

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.