Что нового

Как грамотно перевести \"const char *options[]\" с C++ в формат Autoit

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Я собственно опять с вопросом по структурам :smile:
Вроде всё ясно, но на поверку спотыкаюсь.

Понимаю, что выражение:
Код:
const char *options[]
в Cи означает указатель на массив, состоящий и знаков строки помещённой в него.

Понятно, что в Autoit это должно выглядеть так:
Код:
DllStructCreate( 'char['StringLen("длина строки")'];)


Но код ниже мне непонятен:
Код:
const char *options[] = {
 "document_root", "/var/www",
 "listening_ports", "8080",
 NULL
};

Так я пытаюсь решить поставленную пред собой задачу:
Код:
; ============================================================
; Перевожу в формат Autoit
; ============================================================
; Вариант 1
$s_String = '"document_root", "./var/www", "listening_ports", "8080", 0'
$p_Options = DllStructCreate( 'char['& StringLen($s_String) &'];')
DllStructSetData($pOptions, 1, $s_String)

; Вариант 2
$s_DocRoot	= '"document_root", "./var/www"'
$s_ListRort	= '"listening_ports", "8080"'
$s_Null		= '0'

$p_Options = DllStructCreate('char['& StringLen($s_DocRoot) &'];' _
							&'char['& StringLen($s_ListRort) &'];' _
							&'char['& StringLen($s_Null) &'];' )
   
DllStructSetData($pOptions, 1, $s_String)
DllStructSetData($pOptions, 2, $s_ListRort)
DllStructSetData($pOptions, 3, $s_Null)


Далее подставляем в DllCall
Код:
DllCall($h_Dll, 'int', 'sv_init', 'ptr', DllStructGetPtr($p_Options))

Но Autoit (в обеих вариантах) вылетает с ошибкой :(
Пробовал переводить строки в BSTR результат тот же.
Буду рад любой информации.


Добавлено:
Сообщение автоматически объединено:

Да, совсем забыл! Если параметр $p_Options выставить в NULL то функция нормально отрабатывает (берутся параметры по умолчанию)
Код:
DllCall($h_Dll, 'int', 'sv_init', 'ptr', DllStructGetPtr(0))
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
В вашем варианте ошибка, Вы присваиваете переменной $p_Options созданную структуру, а далее вносите в структуру строку через DllStructSetData($pOptions, 1, $s_String) но в DllStructSetData() Вы указываете переменную не $p_Options а $pOptions, может в этом ошибка, или это просто опечатка?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: Как грамотно перевести \\\\\\\"const char *options[]\\\\\\\" с C++ в формат Autoit

Во-первых, не забывайте, что все строки являются нуль-терминированными, т.е. заканчиваются символом с кодом 0. Поэтому размер структуры для строки должен быть всегда на 1 символ больше.

Код:
$p_Options = DllStructCreate( 'char['& (StringLen($s_String) + 1) &'];')


Во-вторых, вы уверены, что нужно использовать ANSI, а не Unicode строку.



Добавлено:
Сообщение автоматически объединено:

А еще лучше дать ссылку на описание DLL (если есть).


Добавлено:
Сообщение автоматически объединено:

Кстати, намного проще вызвать функцию так (что есть тоже самое):

Код:
DllCall($h_Dll, 'int', 'sv_init', 'str', $s_String)
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Попробовал написать, понятия не имею, правильно ли.
Зы: поправил
Код:
Dim $aStrings[5] = [4, 'document_root', '/var/www', 'listening_ports', '8080']
Dim $aStructStrings[5] = [$aStrings[0]]

#cs
Для каждого string создаём массив из char,
заполняем массив данными из string,
последним элементом массива записываем нуль (null-terminated string)
#ce
For $i = 1 To $aStrings[0]
    $sString = $aStrings[$i]
    $tStruct = DllStructCreate('char[' & StringLen($sString)+1 & ']')

    For $j = 1 To StringLen($sString)
        DllStructSetData($tStruct, 1, Asc(StringMid($sString, $j, 1)), $j)
    Next
    DllStructSetData($tStruct, 1, 0, StringLen($sString)+1)

    $aStructStrings[$i] = $tStruct
Next


#cs
Создаём массив из указателей,
заполняем указателями на string
#ce
$tPtrArray = DllStructCreate('INT_PTR[' & $aStructStrings[0]+1 & ']')
For $i = 1 To $aStructStrings[0]
    DllStructSetData($tPtrArray, 1, DllStructGetPtr($aStructStrings[$i], 1), $i)
Next
DllStructSetData($tPtrArray, $aStructStrings[0]+1, 0)

$pPtrArray = DllStructGetPtr($tPtrArray, 1)

DllCall($h_Dll, 'int', 'sv_init', 'ptr', $pPtrArray)
 
Верх