|
Как правильно передать указатель в функцию из dll
|
|||
---|---|---|---|
#18+
Добрый день. Есть подключаемая к проекту на C# длл с нужной мне функцией. Функция принимает два параметра - адреса буфферов типа byte. Так как синтаксис и принципы написания программ в C# заметно отличаются от C++, возникли трудности - не получается получить адресс выделенного буффера. Подскажите, что я не так делаю? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2013, 03:41 |
|
Как правильно передать указатель в функцию из dll
|
|||
---|---|---|---|
#18+
Random2, p/invoke сам умеет работать с массивами, поэтому можно написать так: Код: c# 1. 2. 3. 4. 5. 6. 7.
fixed не нужен т.к. он будет сделан автоматически в этом случае. На будущее имей в виду что для ручной передачи указателя есть тип IntPtr. P.S. Для расчета md5 в .NET есть класс MD5CryptoServiceProvider . ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2013, 10:36 |
|
Как правильно передать указатель в функцию из dll
|
|||
---|---|---|---|
#18+
Можно как bazile прделожил, а можно и так. надо взять новый, не зафиксированный указатель от fixed int *PHashBuffer и будет щастье Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2013, 11:58 |
|
Как правильно передать указатель в функцию из dll
|
|||
---|---|---|---|
#18+
bazile , Исправил, но уже при выполнении программы получил другую ошибку: "Attempted to read or write protected memory. This is often an indication that other memory is corrupt." Что имеется ввиду под защищенной памятью? Насчет класса MD5CryptoServiceProvider в курсе, но мне нужно именно из длл вызвать функцию. beg-in-er , Не выходит, на этой и следующей строках Код: c# 1. 2.
error CS0208: Cannot take the address of, get the size of, or declare a pointer to a managed type ('byte[]') error CS0266: Cannot implicitly convert type 'byte[]*' to 'int*'. An explicit conversion exists (are you missing a cast?) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2013, 17:34 |
|
Как правильно передать указатель в функцию из dll
|
|||
---|---|---|---|
#18+
Random2, процессор и ОС имеют механизмы защиты памяти позволящие указать уровень доступа - чтение/запись. Если такая ошибка возникает в программе, то причины могут быть разные. Возможно соглашение о вызове (calling convention) надо указать. Возможно твоя функция неправильно работает с памятью. Тогда надо её исправлять. Random2Насчет класса MD5CryptoServiceProvider в курсе, но мне нужно именно из длл вызвать функцию. Зачем, если не секрет? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2013, 18:17 |
|
Как правильно передать указатель в функцию из dll
|
|||
---|---|---|---|
#18+
Random2, beg-in-er, Не выходит, на этой и следующей строках я быстро делал , не сразу посмотрел. просто ваш код переделал. думал у вас всё в коде в порядке естественно не будет. вот отплиленная и копилирующая тема. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
или вот точно работающий вариант. Код: c# 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.
кстати , а подо что компилите. под х86 или под х64. указатели там же разные. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2013, 19:38 |
|
Как правильно передать указатель в функцию из dll
|
|||
---|---|---|---|
#18+
bazile, Нужна максимальная скорость. А стандартная C# функция позволяет получить около 100 000 хешей в секунду. beg-in-er, Пробовал и x32 и x64 - все равно получал ошибку. Попробовал ваш код под х32 - теперь все ОК, но все равно иногда получаю или неправильные хеши или ошибки. Тут уже дело, я думаю в самой dll-ке. Спасибо вам большое за помощь, ушел искать причину в коде dll. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2013, 01:17 |
|
Как правильно передать указатель в функцию из dll
|
|||
---|---|---|---|
#18+
Random2bazile, Нужна максимальная скорость. А стандартная C# функция позволяет получить около 100 000 хешей в секунду. try it. вроде больше ляма в секунду выдаёт Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2013, 02:35 |
|
Как правильно передать указатель в функцию из dll
|
|||
---|---|---|---|
#18+
beg-in-er, Что-то не очень похоже на вычисление MD5 строки. Хотябы даже потому, что тип возвращаемого значения - int. Даже если перевести результат из dec в hex, все равно и близко не похоже на MD5 Хеш. Или есть какие-нибудь тонкости работы с этой функцией? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2013, 02:47 |
|
Как правильно передать указатель в функцию из dll
|
|||
---|---|---|---|
#18+
Random2, пример приведенный beg-in-er-ом точно не md5 вычисляет ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2013, 14:23 |
|
Как правильно передать указатель в функцию из dll
|
|||
---|---|---|---|
#18+
Random2beg-in-er, Что-то не очень похоже на вычисление MD5 строки. Хотябы даже потому, что тип возвращаемого значения - int. Даже если перевести результат из dec в hex, все равно и близко не похоже на MD5 Хеш. Или есть какие-нибудь тонкости работы с этой функцией? а , в запарке был , среагировал на "Хэшкод" ))) а по MD5 Есть же куча открытых реализаций , в частности куча открытых реализаций берите и пользуйтесь . ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2013, 14:35 |
|
|
start [/forum/topic.php?fid=20&msg=38106898&tid=1405360]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
57ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 163ms |
0 / 0 |