powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как мне написать API-ф-цию чтоб возвращала строку.
3 сообщений из 53, страница 3 из 3
Как мне написать API-ф-цию чтоб возвращала строку.
    #38319798
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилтебе рассказать, что такое переполнение буфера или сам нагуглишь?
Спасибо, не нужно :)
За небрежность C кода извиняюсь. И malloc и free для string здесь, конечно же, были бы уместны.
И не нужно рассказывать про то, что Strncpy сама не допускает переполнения, а VB, в отличие от C, сам за собой подчищает память, кроме объектных переменных, конечно (не наш случай).
А со стороны VB, если посмотрите, разумные для примера меры приняты.

Если бы я делал для себя, то передавал бы из VB в DLL и/или обратно только указатель на начало строки, чтобы исключить преобразования из 2 байтных в однобайтные массивы и обратно.
Подробнее написал там: 14519739
...
Рейтинг: 0 / 0
Как мне написать API-ф-цию чтоб возвращала строку.
    #38319829
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Для получения crash с кодом предложенным White Owl выполнить этот код вполне достаточно для указанных двух случаев:
1) NULL
2) lenth > nMaxCount- 1

1) NULL
Вы так горячо спорили про этот самый NULL.
Но ни один из вас даже намеком не обмолвился что нельзя делать
strlen (NULL)
и именно эта строчка и дает crash

Проверяйте,
Код: plaintext
1.
2.
3.
  char * test = NULL;
  int i = (int) strlen(test);  
  printf("i= %d\n", i);


этого например достаточно чтоб вылететь в мир иной

Надо хотя бы ЭТО проверять.
Код: plaintext
1.
2.
3.
  int lenth = 0;
  if (UserName != NULL)
    lenth =(int) strlen(UserName);



2) lenth > nMaxCount- 1
Что касается strncpy _s то что бы там не было в документациях, при конструкции
Код: plaintext
1.
errno_t rc = strncpy_s(lpString, nMaxCount, UserName, length);


она извините ругается МАТОМ а не ошибкой в errno_t rc как видимо следует из документации.

А вот вариант
Код: plaintext
1.
strncpy(lpString, UserName, length);


очень даже проходной с этой точки зрения.
Компилятор чего-то там бурчит, но ведь компилирует, и программа дух не испускает.
Честно говоря к чертям этот nMaxCount, толку от него никакого, да и он нуль-терминаторов честно говоря тоже, length то известна, мусор по-любому отсекается на уровне приложения.

Посему вот так в самый раз:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
С++
int __stdcall char_Get_Registration_Information(char* chrString)
{ 
  int lenth = 0;
  if (UserName != NULL)
    lenth =(int) strlen(UserName);
  strncpy(chrString, UserName, lenth);
  return lenth;
}

int __stdcall LPTSTR_Get_Registration_Information(LPTSTR lpString)
{ 
  int lenth = 0;
  if (UserName != NULL)
    lenth =(int) strlen(UserName);
  strncpy(lpString, UserName, lenth);
  return lenth;
}



Код: vbnet
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.
VB6
Private Declare Function char_Get_Registration_Information Lib "LicenseDll.dll" _
 (ByVal chrString As String) As Long
Private Declare Function LPTSTR_Get_Registration_Information Lib "LicenseDll.dll" _
 (ByVal lpString As String) As Long

Private Sub CommandGetReg_Click() 'LPTSTR
  
  Dim buf As String
  Dim length As Long
  Dim RegInfo As String
    
  buf = Space(256)
  length = LPTSTR_Get_Registration_Information(buf)
  MsgBox length
  If length > 255 Then
    buf = Space(length + 1)
    length = LPTSTR_Get_Registration_Information(buf)
  End If
  RegInfo = Left$(buf, length)
  MsgBox RegInfo
  Text1.Text = RegInfo
End Sub

Private Sub CommandGetRegChar_Click()
  
  Dim buf As String
  Dim length As Long
  Dim RegInfo As String
    
  buf = Space(256)
  length = char_Get_Registration_Information(buf)
  MsgBox length
  If length > 255 Then
    buf = Space(length + 1)
    length = char_Get_Registration_Information(buf)
  End If
  RegInfo = Left$(buf, length)
  MsgBox RegInfo
  Text1.Text = RegInfo
End Sub



ИзопропилДмитрий77,

в случае возврата BSTR нет никакой нужды в передаче длины строки и прочих танцев с бубном с буфером

Да, спасибо. Я оценил наконец.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
BSTR  __stdcall fnString()
{
  int lenth = 0;
  if (UserName != NULL)
    lenth =(int) strlen(UserName);
  return ::SysAllocStringByteLen(UserName,lenth);	
}



Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Private Declare Function fnString Lib "LicenseDll.dll" () As String

Private Sub CommandFnString_Click()
  Dim vb_Str As String
  vb_Str = fnString
  MsgBox vb_Str
  MsgBox Len(vb_Str)
  Text1.Text = vb_Str
End Sub



Черт, никогда ранее не видел чтобы API ф-ция в VB6 ВОЗВРАЩАЛА As String
Круто.

ZVI, спасибо за поддержку.

Как мне все это надоело.
Оставлю наверно свой вариант из второго поста. Вполне себе рабочий вариант такой и уже вставлен в проект.
...
Рейтинг: 0 / 0
Как мне написать API-ф-цию чтоб возвращала строку.
    #38323227
WED67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий77,

Это же легко, ну серьезно. Будет что то сложнее, обращайся.
...
Рейтинг: 0 / 0
3 сообщений из 53, страница 3 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как мне написать API-ф-цию чтоб возвращала строку.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]