Что нового

Размер возвращаемой строки в DllCall

eralex

Знающий
Сообщения
67
Репутация
5
Autoit v.3.3.14.5
Столкнулся с непонятной ситуацией. Есть DLL, написанная на с++. Просто надо вернуть строку в автоит:
Код:
//c++
extern "C" __declspec(dllexport) std::string TESTSTR();

std::string TESTSTR()
{
    return "STROKA1234578908";
}


Код:
$return = DllCall ( "Test.dll", "str", "TESTSTR" )
ConsoleWrite('$return[0]= ' & $return[0] & @CRLF )

Пока в возвращаемой строке 16 и менее символов - всё работает безупречно. Но если возвращать 17 и более символов - либо ошибка либо китайские иероглифы.

Также переделывал DLL на такой вид:
Код:
//c++
extern "C" __declspec(dllexport)  int TESTSTR(char* stroka1)

int TESTSTR(char* stroka1)
{   
    char src1[] = "564g62t46tc4364tc2t34t26t4374723";
    strcpy_s(stroka1, 255, src1);
    return 1;
}



Код:
$hDLL = DllOpen("Test.dll")
$s1 = DllStructCreate("char[255]")
$return = DllCall ( $hDLL, "int", "TESTSTR", "str", DllStructGetPtr($s1) ) ; работает  максимум 16 символов   
DllClose($hDLL)


Результат тот же, максимум корректно передаёт только 16 символов. Написал в с++ программу, которая использует эту DLL, там нет никаких ограничений на колличество передаваемых символов.
Получается это ограничение самого автоита?
 

joiner

Модератор
Локальный модератор
Сообщения
3,570
Репутация
632
последний код 'str' дальше идет параметр
приведу пример . поиск файлов с использованием вызова функции из dll
'Search' - функция
Код:
$hDLL = DllOpen('user.dll')
$Count = DllStructCreate('UINT_PTR')
$Result = DllCall($hDLL, 'UINT_PTR', 'Search', 'STR', 'некий параметр_строка', 'UINT_PTR', DllStructGetPtr($Count))
$Struct = DllStructCreate('char[' & DllStructGetData($Count, 1) & ']', $Result[0])
$string = DllStructGetData($Struct, 1)
DllClose($hDLL)
или
Local $hDLL = DllOpen("user.dll")
Local $sStruct = 0
Local $sResult = DllCall($hDLL, "str", "Search", "str", "параметр",'uint*',$sStruct)
ConsoleWrite($sResult[0] & @LF)
 
Автор
E

eralex

Знающий
Сообщения
67
Репутация
5
Я так понял, передаётся не сама строка, а указатель на ячейку памяти, где располагается строка
 

Prog

Продвинутый
Сообщения
617
Репутация
80
Проверил на PB.
Код:
ProcedureDLL.s TESTSTR()
  ProcedureReturn "1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM<>"
EndProcedure
Код:
$return = DllCall ( "Test.dll", "wstr", "TESTSTR" )
ConsoleWrite('$return[0]= ' & $return[0] & @CRLF )
Строка передается без ограничения по размеру.
Проблема в плюсах.
 

Вложения

  • Test_dll.7z
    1.9 КБ · Просмотры: 1

johnmarshall

Осваивающий
Сообщения
202
Репутация
39
какой компилятор вы используете для сборки dll?
и какие параметры сборки?
в какой кодировке возвращается строка: ANSI, utf16,32,8 ?
там же еще "\0" в конце вроде должен быть..
 
Последнее редактирование:
Автор
E

eralex

Знающий
Сообщения
67
Репутация
5
Всё, решил проблему. Чтобы Автоит понимал С++ - строки, необходимо использовать тип wchar_t*. Например, исходный код С++ DLL должен выглядеть примерно так:
Код:
const wchar_t* TESTWSTR()  
{
    const wchar_t* s = L"Hello, World!12345678901234567";
    return s;
}

А вызывать из автоита так:
Код:
$return = DllCall ( "MathLibrary.dll", "wstr", "TESTWSTR" )

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

какой компилятор вы используете для сборки dll?
и какие параметры сборки?
в какой кодировке возвращается строка: ANSI, utf16,32,8 ?
там же еще "\0" в конце вроде должен быть..
Перепробовал все возможные кодировки и типы текстовых переменных
 
Верх