Недавние сообщения

Страницы: 1 ... 8 9 [10]
91
Общие вопросы по AutoIt / Re: "память не может быть 'read'" после использования DllCall()
« Последний ответ от real_sm Отправлен Январь 17, 2017, 18:40:24 »
Короче, у них еще и типы переназначены:

typedef int VINT;
typedef int VBOOL;
typedef char VCHAR;
typedef unsigned char VBYTE;
typedef unsigned short VWORD;
typedef unsigned long VDWORD;
typedef unsigned __int64 VDWORD64; (In Linux, will using uint64_t data type.)

Поменял и заработало:

Код: AutoIt [Выделить]
$vr_array_info = DllStructCreate("ushort status;ubyte raidType;ubyte diskNum;ulong capacityLow;ulong capacityHigh;ulong realCapacityLow;ulong realCapacityHigh;ulong stripeSize;ulong blockSize;int bNeedMigration;int bNeedInit;int bOptimized;ubyte systemDisk;ushort raid_index;int index")
$sTest = DllCall($hDLL, "int:cdecl", "?vr_get_array_info@@YAHHPAU_vr_array_info@@@Z", "int", 0, "struct*", DllStructGetPtr($vr_array_info))


Всем спасибо!
92
Общие вопросы по AutoIt / Re: "память не может быть 'read'" после использования DllCall()
« Последний ответ от InnI Отправлен Январь 17, 2017, 17:16:12 »
real_sm
Если у них документация с описанием не совпадает, то в dll может быть всё, что угодно.
93
Общие вопросы по AutoIt / Re: "память не может быть 'read'" после использования DllCall()
« Последний ответ от real_sm Отправлен Январь 17, 2017, 17:01:28 »
real_sm
По-моему, в описании структуры $vr_array_info у вас пропущены realCapacityLow и realCapacityHigh. К тому же raid_index должен быть word, а не byte.

Веселые ребята в этом VIA работают. Вот как в PDF-ке:

vr_array_info_t
typedef struct _vr_array_info {
VWORD status;
VBYTE raidType; // value 0xFF means
// a stand-alone disk. When it's a stand-alone disk,
// only diskNum has meaning, and diskNum should
// always be 1 .
VBYTE diskNum;// count of valid disk members.
VDWORD capacityLow;// (Unit: sector)
VDWORD capacityHigh;// (Unit: sector)
VDWORD stripeSize; // valid when raid is raid0 or raid01, in Kbytes
VDWORD blockSize; // valid when raid is RAID5, in Kbytes
VBOOL bNeedMigration; // the raid need migration
// only valid when raid0/raid5/matrixRaid
VBOOL bNeedInit; // the raid need initialization, only valid for RAID5
VBOOL bOptimized; // only for RAID5, this RAID5 access was optimized
VBYTE systemDisk; /* does the devices within this disk array contain system
files of current running OS ? The probably value are:
VR_DEVICE_NOT_SYS_DISK
VR_DEVICE_MAYBE_SYS_DISK
VR_DEVICE_SYS_DISK
they are defined in this file */
VBYTE raid_index;// only raid index, no meaning with stand-alone disk
VINT index; // all device index, including all raid and stand-alone disk
} vr_array_info_t;


"struct*" я так понимаю - это указатель на структуру. Вероятно нужно передать
Код: AutoIt [Выделить]
DllStructGetPtr($vr_array_info)


Поменял 2 строчки кода:

Код: AutoIt [Выделить]
$vr_array_info = DllStructCreate("ushort status;byte raidType;byte diskNum;dword capacityLow;dword capacityHigh;dword realCapacityLow;dword realCapacityHigh;dword stripeSize;dword blockSize;boolean bNeedMigration;boolean bNeedInit;boolean bOptimized;byte systemDisk;ushort raid_index;int index")
$sTest = DllCall($hDLL, "int:cdecl", "?vr_get_array_info@@YAHHPAU_vr_array_info@@@Z", "int", 0, "struct*", DllStructGetPtr($vr_array_info))
 


Та же ерунда.

А для передачи переменной кавычки не нужны. Это я про "$pTest" в кавычках.

Странно, действительно не нужны. Вроде бы изначально без кавычек не получалось, но действительно, не нужны. Спасибо!

Вот основная проблема так и осталась...
94
Общие вопросы по AutoIt / Re: "память не может быть 'read'" после использования DllCall()
« Последний ответ от InnI Отправлен Январь 17, 2017, 16:19:04 »
real_sm
По-моему, в описании структуры $vr_array_info у вас пропущены realCapacityLow и realCapacityHigh. К тому же raid_index должен быть word, а не byte.

"struct*" я так понимаю - это указатель на структуру. Вероятно нужно передать
Код: AutoIt [Выделить]
DllStructGetPtr($vr_array_info)


А для передачи переменной кавычки не нужны. Это я про "$pTest" в кавычках.
95
Общие вопросы по AutoIt / Re: "память не может быть 'read'" после использования DllCall()
« Последний ответ от real_sm Отправлен Январь 17, 2017, 15:38:44 »
real_sm
проблема не с библиотекой, а в
1. Операционной системе
2. Оперативной памяти
3. ... и так далее
В моей системе все функции выполняются

А у Вас тоже VIA RAID? Если нет, то библиотека на последнюю функцию Вам просто отвечает VR_ERR_INVALID_INDEX, спотыкаясь на первом аргументе (номер массива в RAID). До второго аргумента дело не доходит.
96
Общие вопросы по AutoIt / Re: "память не может быть 'read'" после использования DllCall()
« Последний ответ от joiner Отправлен Январь 17, 2017, 14:38:01 »
real_sm
проблема не с библиотекой, а в
1. Операционной системе
2. Оперативной памяти
3. ... и так далее
В моей системе все функции выполняются
97
Общие вопросы по AutoIt / "память не может быть 'read'" после использования DllCall()
« Последний ответ от real_sm Отправлен Январь 17, 2017, 13:00:07 »
Здравствуйте.

Есть некая DLL'ка и к ней инструкция. DLL скомпилирована в MS C++ 6.0. В библиотеке есть функция:

Get information of disk arrays
Declaration:
VINT vr_get_array_info (VINT array_index, vr_array_info_t* pinfo);
Description:
Application can fetch the information of one specific disk array, which is located
by index of all disk arrays in current system.
Input parameters:
VINT array_index :
Index to all disk arrays in system, specify which disk array.
vr_array_info_t *pinfo :
14
Pointer to a vr_array_info_t data structure to get the information
Return value:
VR_SUCCESS :
Get the information successfully.
VR_ERR_NOT_INITED :
Raid lib hasn’t been initialized.
VR_ERR_INVALID_INDEX :
The input index is invalid.
VR_ERR_INVALID_PARAM :
Input parameter is invalid: the pointer is NULL.

DLL Export Viewer так пишет об этой функции:

Function Name     : int __cdecl vr_get_array_info(int,struct _vr_array_info *)
Вот как выглядит этот _vr_array_info в хедере:

typedef struct _vr_array_info {
        VWORD status;  // current status of disk array
                       
        VBYTE raidType;// same as Disk_Array.raidType, but value 0xFF means
                        // a stand-alone disk. When it's a stand-alone disk,
                        // only arDevices[0] and diskNum has meaning, and diskNum should
                        // always be 1 .

        VBYTE diskNum;// count of valid arDevices[] members.

        // Note: disk array maybe incomplete, i.e. , some disk in the array maybe missing,
        //     corresponding device ptr arDevices[i]->pRealDevice should be NULL.
       
        VDWORD capacityLow;// (Unit: sector)
        VDWORD capacityHigh;// (Unit: sector)

        // following 8 bytes define the real-capcity (in sector) of every disk in array
        VDWORD realCapacityLow;        // (Unit: sector)
        VDWORD realCapacityHigh;       // (Unit: sector)


        VDWORD stripeSize; // valid when raid is raid0, raid5 or raid01, in Kbytes
        VDWORD blockSize; // valid when raid is RAID5, in Kbytes

        VBOOL  bNeedMigration; // the raid need migration
                               // only valid when raid0/raid5/matrixRaid
        VBOOL  bNeedInit;      // the raid need initialization, only valid for RAID5
        VBOOL  bOptimized;     // only for RAID5, this RAID5 access was optimized

         VBYTE systemDisk;     /* does the devices within this disk array
                                  contain system files of current running OS ?
                                   the probably value are:
                                   VR_DEVICE_NOT_SYS_DISK
                                   VR_DEVICE_MAYBE_SYS_DISK
                                   VR_DEVICE_SYS_DISK
                                 they are defined in this file */

        VWORD raid_index;// only raid index, no meaning with stand-alone disk
        VINT  index; // all device index, including all raid and stand-alone disk
} vr_array_info_t;

А вот мой код (функции в библиотеке decorated, поэтому так странно выглядят в коде):

Код: AutoIt [Выделить]
Local $pTest

$hDLL = DllOpen(@ScriptDir & "\drvInterface.dll")

;~ VINT vr_init (void);
ConsoleWrite("vr_init..." & @CRLF)
$sTest = DllCall($hDLL, "int:cdecl", "?vr_init@@YAHXZ")

;~ VINT vr_get_controller_num (VINT *pnumber);
ConsoleWrite("vr_get_controller_num..." & @CRLF)
$sTest = DllCall($hDLL, "int:cdecl", "?vr_get_controller_num@@[email protected]", "int*", "$pTest")
$iControllerNumber = $sTest[1]
ConsoleWrite("$iControllerNumber = " & $iControllerNumber & @CRLF)

;~ VINT vr_get_device_num (VINT *pnumber);
ConsoleWrite("vr_get_device_num..." & @CRLF)
$sTest = DllCall($hDLL, "int:cdecl", "?vr_get_device_num@@[email protected]", "int*", "$pTest")
$iDeviceNumber = $sTest[1]
ConsoleWrite("$iDeviceNumber = " & $iDeviceNumber & @CRLF)

;~ VINT vr_get_array_num (VINT only_raid, VINT *pnumber);
ConsoleWrite("vr_get_array_num..." & @CRLF)
$sTest = DllCall($hDLL, "int:cdecl", "?vr_get_array_num@@[email protected]", "int", 0, "int*", "$pTest")
$iArrayNumber = $sTest[2]
ConsoleWrite("$iArrayNumber = " & $iArrayNumber & @CRLF)

$vr_array_info = DllStructCreate("ushort status;byte raidType;byte diskNum;dword capacityLow;dword capacityHigh;dword stripeSize;dword blockSize;boolean bNeedMigration;boolean bNeedInit;boolean bOptimized;byte systemDisk;byte raid_index;int index")
;~ VINT vr_get_array_info (VINT array_index, vr_array_info_t* pinfo);
ConsoleWrite("vr_get_array_info..." & @CRLF)
$sTest = DllCall($hDLL, "int:cdecl", "?vr_get_array_info@@YAHHPAU_vr_array_info@@@Z", "int", 0, "struct*", $vr_array_info)

;~ void vr_exit (void);
ConsoleWrite("vr_exit..." & @CRLF)
$sTest = DllCall($hDLL, "none", "?vr_exit@@YAXXZ")

DllClose($hDLL)

Exit


Все работает как полагается вплоть до вызова vr_get_array_info. По вызову vr_get_array_info AutoIt3.exe вызывает ошибку "память не может быть 'read'" ("Инструкция по адресу 0x7c93a514 обратилась к памяти по адресу 0x00000000"). При этом судя по консоли продолжает выполнение кода, но ошибка все равно всплывает.

Подскажите, пожалуйста, что я делаю не так?
99
Столкнулся с проблемой что одна функция находит мне координаты $x, $y относительно рабочего стола, а вторая функция принимает координаты только клиентского приложения, есть ли простой способ как то с конвертировать то что имеем в то что нужно?

Получаем координаты
Код: AutoIt [Выделить]
$istradepossible = _ImageSearch("img.bmp", 0, $crds[0], $crds[1], 50)


а применить их надо в _WinAPI_GetPixel
Код: AutoIt [Выделить]
$hWnd = WinGetHandle('1', '')
$hDC = _WinAPI_GetDC($hWnd)
$px = _WinAPI_GetPixel($hDC, $loopX+$x, $loopY+$y)

100
Автоустановка приложений / Re: [Автоматизация] Установка OCS
« Последний ответ от gdu Отправлен Январь 17, 2017, 09:16:21 »

gdu, а что в вашем коде означает эта, не раз повторяющаяся, строка?
Код: AutoIt [Выделить]
RunWait ("net start ""ocs inventory service""")

[/quote]

ожидание момента окончания работы программы, после чего продолжить выполнение скрипта,
далее удаление временной папки и появление информационного окна.
DirRemove ($temp_path, 1)
SplashOff ()
MsgBox (64, "Установка "&$app_name, @LF&"Установка "&$app_name&" успешно завершена!")
Страницы: 1 ... 8 9 [10]