Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Маршалинг возвращаемого значения
|
|||
|---|---|---|---|
|
#18+
Привет! Помогите, пожалуйста определить функцию: Код: plaintext В counter возвращается число элементов в возвращаемом массиве (RateInfo*). Я попробовал переписать вот так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Как нужно написать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2004, 22:52 |
|
||
|
Маршалинг возвращаемого значения
|
|||
|---|---|---|---|
|
#18+
как вариант: возвращай IntPtr и в цикле заполни массив структур TRateInfo через Marshal.PtrToStructure ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2004, 01:28 |
|
||
|
Маршалинг возвращаемого значения
|
|||
|---|---|---|---|
|
#18+
Списибо, но не приведете ли простой примерчик на "заполние массива через Marshal.PtrToStructure". Плииииз! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2004, 18:24 |
|
||
|
Маршалинг возвращаемого значения
|
|||
|---|---|---|---|
|
#18+
например: Код: plaintext 1. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2004, 18:40 |
|
||
|
Маршалинг возвращаемого значения
|
|||
|---|---|---|---|
|
#18+
ээ... не знаю, работает ли это, но попробуй, пока кузя не пришел ;) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2004, 18:54 |
|
||
|
Маршалинг возвращаемого значения
|
|||
|---|---|---|---|
|
#18+
о, во-первых кузя пришел (привет, кузя), во-вторых у меня ошибка в коде, не (int)rateptr + i*size, а ((int)rateptr + size, и поместить ее надо ниже строки с rates.Add(), ну в общем-то уже неважно ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2004, 19:08 |
|
||
|
Маршалинг возвращаемого значения
|
|||
|---|---|---|---|
|
#18+
2 taj привет :) предупреждать надо, что ж это мы с тобой на пару практически один и тот же код пишем ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2004, 19:16 |
|
||
|
Маршалинг возвращаемого значения
|
|||
|---|---|---|---|
|
#18+
СПАСИБО ОГРОМНОЕ ОБОИМ!!! :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2004, 19:58 |
|
||
|
Маршалинг возвращаемого значения
|
|||
|---|---|---|---|
|
#18+
И еще пара маленьких вопросиков вдогонку, если вы не против. :) 1. Как проверить IntPtr на равеноство c null? (функция при ошибках возвращает "null") 2. Кузя:"// освободить память -> org". А как это, собственно, сделать? ;) И где можно про это почитать в MSDN: когда надо освобождать а когда не надо.... вообще-то на http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconmemorymanagement.asp написано следующее: "The interop marshaler always attempts to free memory allocated by unmanaged code. This behavior complies with COM memory management rules, but differs from the rules that govern native C++. Confusion can arise if you anticipate native C++ behavior (no memory freeing) when using platform invoke, which automatically frees memory for pointers.". Что бы это значило??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2004, 21:41 |
|
||
|
Маршалинг возвращаемого значения
|
|||
|---|---|---|---|
|
#18+
1. проверка на нулевое значение Код: plaintext 1. 2. 2. надо смотреть документацию на твою функцию MtGetRates. в ней (документации) д.б. примерно такие слова This buffer is allocated by the system and must be freed using the NetApiBufferFree function. или To free a block of memory, use the HeapFree function. или The calling application is responsible for freeing the returned PIDL by using the Shell allocator's IMalloc::Free method. и т.д. и вызвать соответствующую функцию освобождения памяти (опять же через PInvoke или Marshal.FreeCoTaskMem, Marshal.FreeHGlobal) и передать ей указатель на на эту память (см. IntPtr org;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2004, 22:41 |
|
||
|
Маршалинг возвращаемого значения
|
|||
|---|---|---|---|
|
#18+
1. //if(ptr==IntPtr.Zero) Спасибо. 2. В описании есть слова: "Массив должен быть освобождён при помощи функции HeapFree( GetProcessHeap(), 0, pRates );" т.е. мне Invoke'ить HeapFree? 3. Относительно Marshal.FreeCoTaskMem, Marshal.FreeHGlobal... Я думал это только при освобождении блоков памяти, полученных при вызове соответственно Marshal.AllocCoTaskMem, Marshal.AllocHGlobal; разве это не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2004, 00:18 |
|
||
|
Маршалинг возвращаемого значения
|
|||
|---|---|---|---|
|
#18+
2. и HeapFree() и GetProcessHeap() 3. or any equivalent unmanaged API method FreeHGlobal освобождает память, полученную, например, по GlobalAlloc() внутри unmanaged функции --- PS: чтоб долго не искать Код: plaintext 1. 2. 3. PPS. есть интересный и полезный ресурс PINVOKE.NET там собраны практически все сигнатуры для PInvoke ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2004, 00:59 |
|
||
|
Маршалинг возвращаемого значения
|
|||
|---|---|---|---|
|
#18+
Спасибо! Но у меня опять возникли сложности при маршалинге... помогите, плиз. Есть перечисление: Код: plaintext 1. 2. 3. 4. 5. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Если написать: Код: plaintext 1. Что надо написать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2004, 18:10 |
|
||
|
Маршалинг возвращаемого значения
|
|||
|---|---|---|---|
|
#18+
Ошибочка получилась - третий кусок кода в предыдущем посте такой: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2004, 18:14 |
|
||
|
Маршалинг возвращаемого значения
|
|||
|---|---|---|---|
|
#18+
попробуй указать: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2004, 23:45 |
|
||
|
Маршалинг возвращаемого значения
|
|||
|---|---|---|---|
|
#18+
Это не помогло.... но я вручную преобразовал все значения short в TOp, так что все нормально... было.... пока не начал переписывать под .Net следующий кусок кода: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. ПОМОГИТЕ ПЛИЗ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2004, 16:59 |
|
||
|
Маршалинг возвращаемого значения
|
|||
|---|---|---|---|
|
#18+
маршалинг структуры, включающей в себя массив другой структуры "по значению", не поддерживается (только массивы из известных типов). -- варианты (в порядке возрастания геморроя): замени массив структур на 7 последовательных элементарных структур используй MC++ для interop'a используй классы вместо структур ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2004, 20:08 |
|
||
|
Маршалинг возвращаемого значения
|
|||
|---|---|---|---|
|
#18+
+ замени массив структур на эквивалентный по длине массив байт. после возврата можно сделать преобразование по Buffer.BlockCopy(..); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2004, 20:46 |
|
||
|
Маршалинг возвращаемого значения
|
|||
|---|---|---|---|
|
#18+
>>маршалинг структуры, включающей в себя массив другой структуры "по значению", не поддерживается Я так и думал.... т.к. когда оставляешь только "[MarshalAs(UnmanagedType.ByValArray, SizeConst=16)] public int[] Unused; ", то все проходит нормально. >>используй MC++ для interop'a Что такое MC++? >>используй классы вместо структур Да я пробовал, но там, по-моему, никакой принципиальной разницы... все равно все упирается в этот чертов "public TConSession[] Days;". Или, наверное, я не правильно понимаю... а как так (через классы) можно сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2004, 20:49 |
|
||
|
Маршалинг возвращаемого значения
|
|||
|---|---|---|---|
|
#18+
AdfgЧто такое MC++?Managed Extensions for C++. делаешь отдельную сборку, в которой и общаешься со своей библиотекой "в лоб". Adfg... а как так (через классы) можно сделать?тогда воздержись :) - очень длинная история... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2004, 21:03 |
|
||
|
Маршалинг возвращаемого значения
|
|||
|---|---|---|---|
|
#18+
>>Managed Extensions for C++. понял. >>тогда воздержись :) - очень длинная история... да ладно тебе! расскажи, плиз, коротенько-то... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2004, 22:36 |
|
||
|
Маршалинг возвращаемого значения
|
|||
|---|---|---|---|
|
#18+
если уж совсем коротко :) посмотри статейку C Sharp Ripper там в самом конце есть раздельчик Some translation details ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2004, 23:40 |
|
||
|
Маршалинг возвращаемого значения
|
|||
|---|---|---|---|
|
#18+
Ну вобщем понятно, только там написано, что самое интересное - содержание метода Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2004, 01:18 |
|
||
|
Маршалинг возвращаемого значения
|
|||
|---|---|---|---|
|
#18+
Adfg... а исходники (по ссылке вверху страницы) они скачивать почему-то не дают... зарегистрироваться надо :) лови (40.2 kb) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2004, 03:18 |
|
||
|
Маршалинг возвращаемого значения
|
|||
|---|---|---|---|
|
#18+
PS кстати, у них можно и зарегистрироваться и получать подписку на интересные статьи по .net (~1 раз в 3-4 недели). среди них попадаются очень даже ничего (в смысле идеи и/или реализации), могут когда нибудь и пригодиться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2004, 03:28 |
|
||
|
|

start [/forum/topic.php?fid=20&fpage=996&tid=1437972]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
22ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 241ms |
| total: | 354ms |

| 0 / 0 |
