Re: Казнить нельзя помиловать
От: Vi2 Удмуртия http://www.adem.ru
Дата: 30.06.03 11:26
Оценка: 2 (1)
Здравствуйте, AlexTAI, Вы писали:

ATA>Есть метод у которого 2 параметра

ATA>      ,[out,size_is(*OutcomingChunkSize)] byte **OutcomingChunk,[in,out] long *OutcomingChunkSize

Есть разница между
а) out,size_is(*OutcomingChunkSize,1) == out,size_is(*OutcomingChunkSize)
б) out,size_is(1,*OutcomingChunkSize) == out,size_is(,*OutcomingChunkSize)
В первом случае делаем передачу блока из *OutcomingChunkSize указателей на ОДИН байт (если byte — это байт), во втором — блок из ОДНОГО указателя на *OutcomingChunkSize байт. Поэтому поставь там, где нужно, ЗАПЯТУЮ.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Вылетаю с исключением после возврата из метода...
От: AlexTAI alextai.narod.ru
Дата: 29.06.03 06:15
Оценка:
Есть метод у которого 2 параметра


      ,[out,size_is(*OutcomingChunkSize)] byte **OutcomingChunk
        ,[in,out] long *OutcomingChunkSize


В конце метода делаю

*OutcomingChunk = CoTaskMemAlloc(NeededSize);
// Initialize memory...

*OutcomingChunkSize = NeededSize;


Метод отрабатывается а после выхода из метода получаю исключение "Память по адресу ... не может быть записана..."

СОМ сервер — EXE.

Все это вылетает где то в глубинах NTDLL (хотя по дороге еще в стеке есть rpcrt4).

Может кто сталкивался. Сильное подозрение на проксю — но как лечить не знаю.

Есть соображения?
Тумаров Александр ( AlexTAI )
alextai3@yahoo.com
Re: Вылетаю с исключением после возврата из метода...
От: George Seryakov Россия  
Дата: 29.06.03 13:24
Оценка:
Здравствуйте, AlexTAI, Вы писали:


ATA>Все это вылетает где то в глубинах NTDLL (хотя по дороге еще в стеке есть rpcrt4).


ATA>Может кто сталкивался. Сильное подозрение на проксю — но как лечить не знаю.


ATA>Есть соображения?


Переписать на safearray, как (тебе?) советовали. Ведь не зря советовали ж. Вникаешь?
GS
Re[2]: Вылетаю с исключением после возврата из метода...
От: AlexTAI alextai.narod.ru
Дата: 29.06.03 13:58
Оценка:
GS>Переписать на safearray, как (тебе?) советовали. Ведь не зря советовали ж. Вникаешь?

Вникаю... Вникаю — Однако вопрос был с чем связанно подобнре поведение и как лечить.
Вместо перехода на сэфаррай можно было предложить и смену профессии.

Есть еще предложения
Тумаров Александр ( AlexTAI )
alextai3@yahoo.com
Re: Вылетаю с исключением после возврата из метода...
От: skyline Россия  
Дата: 30.06.03 10:03
Оценка:
Здравствуйте, AlexTAI

Дай пожалуйста код клиента.
Очень возможно, что ты установил указатель на указатель в NULL.
А вообще, ты прав — если в данном способе передачи параметров проблеммы, то не значит, что надо браться за safearray.
If the milk turns out to be sour,
I ain't the kind of pussy to drink it
Re[2]: Казнить нельзя помиловать
От: AlexTAI alextai.narod.ru
Дата: 30.06.03 19:06
Оценка:
Здравствуйте, Vi2, Вы писали:

Спасибо — проблема частично разрешилась — теперь исключение появляется только во время отладки с сообщением

Heap[TAI.exe]: Invalid Address specified to RtlFreeHeap(130000,7c2908)
Unhandled exception at 0x77f97704 in TAI.exe: User breakpoint

Если жму на продолжение исполнения — то выполняется и завершается нормально. Не под отладчиком все выполняется просто на ура. Вопрос это так должно быть или нет? (раньше возникалл эксепшен который не давал продолжать работу кода вообще)

И еще вопрос- где прочитать подробно про разницу записи с запятой и без запятой в тех примерах которые были показанны.
Тумаров Александр ( AlexTAI )
alextai3@yahoo.com
Re[2]: Казнить нельзя помиловать
От: AlexTAI alextai.narod.ru
Дата: 30.06.03 19:10
Оценка:
Vi2>
ATA>>      ,[out,size_is(*OutcomingChunkSize)] byte **OutcomingChunk,[in,out] long *OutcomingChunkSize
Vi2>


и еще маленький вопрос- -почему если вместо [in,out] long *OutcomingChunkSize я пишу [out] long *OutcomingChunkSize то компилятор жалуется что не допускаются аргументы указывающие размер массивов как чисто out параметры?
Тумаров Александр ( AlexTAI )
alextai3@yahoo.com
Re[2]: Вылетаю с исключением после возврата из метода...
От: AlexTAI alextai.narod.ru
Дата: 30.06.03 19:27
Оценка:
Здравствуйте, skyline, Вы писали:

S>Здравствуйте, AlexTAI


S>Дай пожалуйста код клиента.

S>Очень возможно, что ты установил указатель на указатель в NULL.
S>А вообще, ты прав — если в данном способе передачи параметров проблеммы, то не значит, что надо браться за safearray.

проверял уже — не тот вариант.
к тому же вылетает сервер а не клиент .
Тумаров Александр ( AlexTAI )
alextai3@yahoo.com
Re[3]: Размерность последнего указателя
От: Vi2 Удмуртия http://www.adem.ru
Дата: 01.07.03 03:38
Оценка:
Здравствуйте, AlexTAI, Вы писали:

ATA>      ,[out,size_is(*OutcomingChunkSize)] byte **OutcomingChunk,[in,out] long *OutcomingChunkSize

ATA>и еще маленький вопрос- -почему если вместо [in,out] long *OutcomingChunkSize я пишу [out] long *OutcomingChunkSize то компилятор жалуется что не допускаются аргументы указывающие размер массивов как чисто out параметры?

Читай [size_is] топик для МИДЛа — я не совсем в курсе всех тонкостей, которые существуют для своей прокси/стаба (я этим просто не занимался, хватало стандартного TLB маршаллера).

Проблема в том, что не каждая размерность должна быть выделена сервером через CoTaskMemAlloc. Какие-то должна делать прокси. Как правило, прокси выделяет память под самый верхний указатель (т.е. обеспечивает корректность самого верхнего указателя. Потому что нет в С/С++ способа передать его назад или изменить. Смотри fff(int* p) — можно поменять значение ячейки p[0] или нескольких таких ячеек p[0]...p[n] (если выделено более одной ячейки), но не самого указателя p. Чтобы изменить значение указателя, нужно делать дополнительную косвенность fff(int* *p), но и тогда само p — неизменно).

В твоем примере выше прокси не сможет обеспечить этот указатель, т.к. нет информации о количестве элементов до вызова метода. Этот размер станет известен только после вызова метода. Поэтому и генерится сообщение.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[3]: Казнить нельзя помиловать
От: Begun Ulad Беларусь  
Дата: 01.07.03 05:48
Оценка:
Здравствуйте, AlexTAI, Вы писали:

Vi2>>
ATA>>>      ,[out,size_is(*OutcomingChunkSize)] byte **OutcomingChunk,[in,out] long *OutcomingChunkSize
Vi2>>


ATA>и еще маленький вопрос- -почему если вместо [in,out] long *OutcomingChunkSize я пишу [out] long *OutcomingChunkSize то компилятор жалуется что не допускаются аргументы указывающие размер массивов как чисто out параметры?


потому что ты возвращаешь указатель на массив и правильно это делать так:
,[out,size_is(,*OutcomingChunkSize)] byte **OutcomingChunk,[out] long *OutcomingChunkSize

и запятая здесь в size_is(,*OutcomingChunkSize) указывает, что OutcomingChunkSize — это размер массива, на который указывает OutcomingChunk
Поэтому запятую в [size_is()] пропускать в данном случае нельзя.
... << RSDN@Home 1.1 alpha 1 >>
\n Give me MSDN and I'll show you the world
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.