Страница: 1 |
в длл написанной на си есть следующаа функция int Encrypt( LPCSTR lpszP, LPSTR lpszEncrypt // result buffer, guaranteed long enough ) lpszEncrypt must point to a buffer that is at least 8 characters long. правильно ли я задекларировал и вызвал её: Public Declare Function Encrypt Lib "CMVISM32.DLL" (ByVal lpszP As String, ByRef lpszEncrypt As String) As Integer Dim p$ = "3BQ8JB" Dim en$ Dim i% = Encrypt(p, en) потомучто при вызове у меня выдет ошибку System.NullReferenceException: Object reference not set to an instance of an object.
Public Declare Function Encrypt Lib "CMVISM32.DLL" (ByVal lpszP As String, ByVal lpszEncrypt As String) As Integer Попробуй так Страница: 1 |
Вопрос: декларация функции
Добавлено: 26.11.03 15:49
Автор вопроса: Артём Л. | ICQ: 280044491
Ответы
Всего ответов: 3
Номер ответа: 1
Автор ответа:
ZeroX
ICQ: 220401330
Вопросов: 47
Ответов: 406
Профиль | | #1
Добавлено: 26.11.03 17:18
Номер ответа: 2
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #2
Добавлено: 27.11.03 07:39
С такими тонкостями к сожалению не знаком (редко приходится из .NET
вызывать функции API). Но что-то мне подсказывает, что String здесь
использовать нельзя. Нужно передавать строку виксированной длины. Для
этот нужно переменную объявлять с атрибутом MarshalAsAttribute, что-то
типа:
<MarshalAs(UnmanagedType.ByValTStr, sizeconst:=64)> szFileType as String
Номер ответа: 3
Автор ответа:
Артём Л.
ICQ: 280044491
Вопросов: 43
Ответов: 227
Профиль | | #3
Добавлено: 27.11.03 13:27
вот правильная декларация
Public Declare Function Encrypt Lib "CMVISM32.DLL"
(<Runtime.InteropServices.MarshalAs(UnmanagedType.LPStr)> ByVal lpszP As
String, ByVal lpszEncrypt As StringBuilder) As Integer