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 байт. Поэтому поставь там, где нужно, ЗАПЯТУЮ.
ATA>Все это вылетает где то в глубинах NTDLL (хотя по дороге еще в стеке есть rpcrt4).
ATA>Может кто сталкивался. Сильное подозрение на проксю — но как лечить не знаю.
ATA>Есть соображения?
Переписать на safearray, как (тебе?) советовали. Ведь не зря советовали ж. Вникаешь?
GS
Re[2]: Вылетаю с исключением после возврата из метода...
GS>Переписать на safearray, как (тебе?) советовали. Ведь не зря советовали ж. Вникаешь?
Вникаю... Вникаю — Однако вопрос был с чем связанно подобнре поведение и как лечить.
Вместо перехода на сэфаррай можно было предложить и смену профессии.
Есть еще предложения
Тумаров Александр ( AlexTAI )
alextai3@yahoo.com
Re: Вылетаю с исключением после возврата из метода...
Дай пожалуйста код клиента.
Очень возможно, что ты установил указатель на указатель в NULL.
А вообще, ты прав — если в данном способе передачи параметров проблеммы, то не значит, что надо браться за safearray.
If the milk turns out to be sour,
I ain't the kind of pussy to drink it
Спасибо — проблема частично разрешилась — теперь исключение появляется только во время отладки с сообщением
Heap[TAI.exe]: Invalid Address specified to RtlFreeHeap(130000,7c2908)
Unhandled exception at 0x77f97704 in TAI.exe: User breakpoint
Если жму на продолжение исполнения — то выполняется и завершается нормально. Не под отладчиком все выполняется просто на ура. Вопрос это так должно быть или нет? (раньше возникалл эксепшен который не давал продолжать работу кода вообще)
И еще вопрос- где прочитать подробно про разницу записи с запятой и без запятой в тех примерах которые были показанны.
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]: Вылетаю с исключением после возврата из метода...
Здравствуйте, skyline, Вы писали:
S>Здравствуйте, AlexTAI
S>Дай пожалуйста код клиента. S>Очень возможно, что ты установил указатель на указатель в NULL. S>А вообще, ты прав — если в данном способе передачи параметров проблеммы, то не значит, что надо браться за safearray.
проверял уже — не тот вариант.
к тому же вылетает сервер а не клиент .
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 — неизменно).
В твоем примере выше прокси не сможет обеспечить этот указатель, т.к. нет информации о количестве элементов до вызова метода. Этот размер станет известен только после вызова метода. Поэтому и генерится сообщение.
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()] пропускать в данном случае нельзя.