помогите написать программу-парсер - страница 3

 
jartmailru:
Поправка- интерфейсная часть должна быть именно на плюсах
... и даже ни разу не extern "C".

Я про extern "C" и не говорил, вот живой работающий пример из моей ДЛЛ. Эта функция вызывается из МТ4 и передает заранее заполненный буфер в управляемый класс Client, а тот по named pipe отсылает буфер в мою прогу на C#

Насчет плюсов - да, можно использовать static функции класса как dllexport, динамические нельзя, т..к их адреса неизвестны в момент компиляции.

#define CNDLL_EXPFUNC __declspec(dllexport)

// this function is called from MT
CNDLL_EXPFUNC int __stdcall SendBuf()
{
   if(QSize(eTx) <= 0)
      return -1;
   BYTE buf[BUF_SIZE];
   int size = QSize(eTx);
   if(size > BUF_SIZE)
      MessageBox(NULL, "ERROR: size > BUF_SIZE", "SendBuf error", MB_OK + MB_ICONERROR);
   for(int n = 0; n < size; n++)
      buf[n] = QPopByte(eTx);
   int len = AddCRC(buf, size);

   //int result = (int)SendMsgToPipe((BYTE*)buf, size);
   //Beep(100, 50);
   Client::SendMessage((BYTE*)buf, len); // сообщение передается в CLR class Client
   return 0;
}

 
VDev:

Я про extern "C" и не говорил 

Ну да, Вы говорили, что интерфейсная часть должна быть целиком на си. :-)
VDev:

Насчет плюсов - да, можно использовать static функции класса как dllexport, динамические нельзя, т..к их адреса неизвестны в момент компиляции. 

Уважаемый, читать Вас очень интересно... но Вам точно стоит срочно посмотреть семантику keyword'а static!
Признак static (кстати, советуют использовать nameless namespace) как бы не особо совместим с dllexport,
поскольку предполагает, что даже при линковке функция будет недоступна из соседних модулей этого же проекта.
.
А что это за динамические функции в плюсах? ;-)
 
jartmailru:
Ну да, Вы говорили, что интерфейсная часть должна быть целиком на си. :-)
Уважаемый, читать Вас очень интересно... но Вам точно стоит срочно посмотреть семантику keyword'а static!
Признак static (кстати, советуют использовать nameless namespace) как бы не особо совместим с dllexport,
поскольку предполагает, что даже при линковке функция будет недоступна из соседних модулей этого же проекта.
.
А что это за динамические функции в плюсах? ;-)

То есть функция TestFunction(int) не будет видна из другого файла, потому, что она static??? Почитайте про разницу обычными static функциями и static функциями - членами класса.

Она будет видна при условии, что класс TestClass будет виден. Более того, ее можно вызывать без создания экземпляра класса

int i = TestClass::TestFunction(1);

если Вы не согласны, пишите Страуструпу, порадуйте старика :))) http://www2.research.att.com/~bs/homepage.html

class TestClass
{
public:
        static __declspec(dllexport) int __stdcall TestFunction(int);
        TestClass(void);
        ~TestClass(void);
};

int TestClass::TestFunction(int n)
{
        return ++n;
}
 
VDev:

То есть функция TestFunction(int) не будет видна из другого файла, потому, что она static??? Почитайте про разницу обычными static функциями и static функциями - членами класса. 

В Вашем сообщении была фраза про "static функции класса",
которые есть методы. Методы функциями как-то не доводилось называть...
Не обратил внимание, что "класса" ;-). Мои извинения :-).
Эх, всю охоту мне испортили! :-( Про разницу в курсе.
.
Экспортирую всегда обычные функции, не члены класса.
Поэтому и не обратил внимания.
Причина обращения: