Возврат значения из функции интерфейса x2
От: apmyp  
Дата: 14.02.12 15:22
Оценка:
Всем привет,

Столкнулся со следующей странной ситуацией. На C++ написан COM-интерфейс вида:


interface ISomeFace : IDispatch
  {
   [id(1), helpstring("Some count")] HRESULT SomeTotal([out] int* pos);
  };


Если вызываю SomeTotal из кода написанного на C++ — все ок, возвращается корректное значение.
Если же вызывать SomeTotal из кода написанного на Delphi, то значение возвращается почему-то помноженное на 2.

Что это? И как с этим быть? Помогите пожалуйста!
c++ delphi com interface
Re: Возврат значения из функции интерфейса x2
От: Vi2 Удмуртия http://www.adem.ru
Дата: 15.02.12 05:24
Оценка:
Здравствуйте, apmyp, Вы писали:

A>Столкнулся со следующей странной ситуацией. ...

A>Если вызываю SomeTotal из кода написанного на C++ — все ок, возвращается корректное значение.
A>Если же вызывать SomeTotal из кода написанного на Delphi, то значение возвращается почему-то помноженное на 2.

A>Что это? И как с этим быть?


Нужен код вызова и код обработки. По виду метода ничего сказать нельзя.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re: Возврат значения из функции интерфейса x2
От: Jolly Roger  
Дата: 15.02.12 06:57
Оценка:
Здравствуйте, apmyp, Вы писали:

A>Если вызываю SomeTotal из кода написанного на C++ — все ок, возвращается корректное значение.

A>Если же вызывать SomeTotal из кода написанного на Delphi, то значение возвращается почему-то помноженное на 2.

А при импотирте интерфейса про calling convention не забыли?
"Нормальные герои всегда идут в обход!"
Re: Возврат значения из функции интерфейса x2
От: 5er Россия  
Дата: 15.02.12 08:04
Оценка:
Здравствуйте, apmyp, Вы писали:

A>Всем привет,


A>Столкнулся со следующей странной ситуацией. На C++ написан COM-интерфейс вида:



A>
A>interface ISomeFace : IDispatch
A>  {
A>   [id(1), helpstring("Some count")] HRESULT SomeTotal([out] int* pos);
A>  };
A>


A>Если вызываю SomeTotal из кода написанного на C++ — все ок, возвращается корректное значение.

A>Если же вызывать SomeTotal из кода написанного на Delphi, то значение возвращается почему-то помноженное на 2.

A>Что это? И как с этим быть? Помогите пожалуйста!


может
[out,retval]
Re[2]: Возврат значения из функции интерфейса x2
От: apmyp  
Дата: 15.02.12 11:04
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>А при импотирте интерфейса про calling convention не забыли?


Автоматический импорт был.
Re[2]: Возврат значения из функции интерфейса x2
От: apmyp  
Дата: 15.02.12 11:05
Оценка:
Здравствуйте, 5er, Вы писали:

5er>может

5er>[out,retval]

Спасибо, попробую.
Re[3]: Возврат значения из функции интерфейса x2
От: apmyp  
Дата: 15.02.12 11:10
Оценка:
A>Спасибо, попробую.

Не помогло( Остальные функции возврат значения и без retval делали..
Re[2]: Возврат значения из функции интерфейса x2
От: apmyp  
Дата: 15.02.12 11:20
Оценка:
Vi2>Нужен код вызова и код обработки. По виду метода ничего сказать нельзя.

Код вызова:

ISomeFace = interface(IDispatch)
    ['{12345587-5B01-4095-9411-9AA28A052C9B}']
    procedure SomeTotal(out total: SYSINT); safecall;
//    function  SomeTotal: SYSINT; safecall; // если retval сделать, но ошибка останется
    procedure SomeGet(pos: SYSINT; out symbol: WideString); safecall;
  end;

//---
Здесь вызов:
MW. SymbolsTotal(K);


Причем SomeGet нормально строку отдает, а вот SomeTotal <<1 или *2.

Код обработки:

STDMETHODIMP CSome::SomeTotal(int* total)
  {
   if(!pos) return(E_HANDLE);
//--- сохраним
   *pos=m_symbols.size(); // на самом деле там не STL, но не суть, в дебаггере вижу корректное значение
//---
   return(S_OK);
  }


А вот при вызове помноженное на 2.
Re[3]: Возврат значения из функции интерфейса x2
От: apmyp  
Дата: 15.02.12 11:22
Оценка:
Вместо pos везде total, конечно же.
Re[4]: Возврат значения из функции интерфейса x2
От: apmyp  
Дата: 15.02.12 13:18
Оценка:
Странно. На моем компе работает нормально, на чужом — нет.
Re[3]: Возврат значения из функции интерфейса x2
От: rus blood Россия  
Дата: 15.02.12 13:25
Оценка:
Здравствуйте, apmyp, Вы писали:

A>А вот при вызове помноженное на 2.


Количество символов и размер в байтах не перепутал?
Имею скафандр — готов путешествовать!
Re[4]: Возврат значения из функции интерфейса x2
От: apmyp  
Дата: 15.02.12 13:30
Оценка:
RB>Количество символов и размер в байтах не перепутал?

А это можно перепутать?)
Re[4]: Возврат значения из функции интерфейса x2
От: apmyp  
Дата: 15.02.12 13:32
Оценка:
RB>Количество символов и размер в байтах не перепутал?

Там две разные функции. Я всего лишь сказал, что одна функция корректно возвращает, а другая нет. Понятное дело, что они работают с разными параметрами. Подразумевалось, что косяк должен быть системный, если он есть.

Передавать число параметром в виде строки — нонсенс.
Re: Reject
От: apmyp  
Дата: 15.02.12 14:45
Оценка:
Ошибка была навязанной, с темой вопроса никак не связанной. Спасибо за внимание.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.