AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.10.2003, 09:18   #1  
Wing is offline
Wing
Участник
 
12 / 10 (1) +
Регистрация: 08.10.2003
Адрес: Томск
? Обертки к системным и своим функциям (WriteFile)
Здравствуйте!
Существует необходимость в использовании системных функций, таких как CreateFile и WriteFile.
Первую по образу и подобию обертки, уже имеющейся в аксапте, смог для себя приспособить (тот вариант, что был - слишком уж урезан).
Но разобраться окончательно - не смог.
Подскажите, как обернуть функцию WriteFile из библиотеки Kernel32.dll?
Старый 08.10.2003, 20:48   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Посмотрите на класс WinAPI
В частности на метод WinAPI::createFile

Хотя я бы посоветовал воспользоваться классами BinaryIO, AsciiIO, CommaIO и т.п.
Их описание можно найти в ветке AOT \ System Documentation \ Classes
Старый 09.10.2003, 06:14   #3  
Wing is offline
Wing
Участник
 
12 / 10 (1) +
Регистрация: 08.10.2003
Адрес: Томск
? Обертка к WriteFile уж очень нужна.
Именно из WinAPI::createFile я и скопировал обертку к CreateFile, внеся все необходимые коррективы.
Но то же самое сделать для функции WriteFile не получается. Видимо я не до конца понял механизм изготовления таких оберток.
Пробовал сделать так:
PHP код:
    DLL         _winApiDLL      = new DLL('KERNEL32');
    
DLLFunction _writeFile      = new DLLFunction(_winApiDLL'WriteFile');

    
_writeFile.returns( BOOL );
    
_writeFile.arg(int);
    
_writeFile.arg(ExtTypes::Pointer);
    
_writeFile.arg(int);
    
_writeFile.arg(int);
    
_writeFile.arg(ExtTypes::Pointer); 
но ни BOOL, ни boolean внутри _writeFile.returns не принимается.
Сама функция:
PHP код:
BOOL WriteFile(
    
HANDLE hFile,    // handle to file to write to
    
LPCVOID lpBuffer,    // pointer to data to write to file
    
DWORD nNumberOfBytesToWrite,    // number of bytes to write
    
LPDWORD lpNumberOfBytesWritten,    // pointer to number of bytes written
    
LPOVERLAPPED lpOverlapped     // pointer to structure needed for overlapped I/O
   
); 
Все предложенные в прошлом сообщении варианты не позволяют писать напрямую в порт.
Старый 09.10.2003, 09:54   #4  
kalex is offline
kalex
Участник
 
132 / 20 (1) +++
Регистрация: 18.05.2002
Адрес: Москва
Может вместо BOOL написать INT?
Старый 09.10.2003, 10:59   #5  
Wing is offline
Wing
Участник
 
12 / 10 (1) +
Регистрация: 08.10.2003
Адрес: Томск
Требуется совет опытного программиста Аксапты
Я пробовал разные варианты и пришел к единственному выходу - это сделает только тот, кто умеет, а не тот, кто догадывается...
Надеюсь, что такой человек здесь появится...
Старый 09.10.2003, 11:58   #6  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
Могу лишь заметить, что в Axapta есть обертка для функции:
PHP код:
BOOL CreateDirectory(
  
LPCTSTR lpPathName,
  
LPSECURITY_ATTRIBUTES lpSecurityAttributes
); 
И в ней написано для BOOL
PHP код:
_createDirectory.returns(ExtTypes :: DWord); 
Старый 09.10.2003, 12:01   #7  
Lexey is offline
Lexey
Участник
 
59 / 13 (1) ++
Регистрация: 16.05.2002
DLL _winApiDLL = new DLL('KERNEL32');
DLLFunction _writeFile = new DLLFunction(_winApiDLL, 'WriteFile');

_writeFile.returns(ExtTypes:Word);
_writeFile.arg(ExtTypes:Word);
_writeFile.arg(ExtTypes::Pointer);
_writeFile.arg(ExtTypes:Word);
_writeFile.arg(ExtTypes::Pointer);
_writeFile.arg(ExtTypes::Pointer);
Старый 09.10.2003, 12:11   #8  
Wing is offline
Wing
Участник
 
12 / 10 (1) +
Регистрация: 08.10.2003
Адрес: Томск
Не помогло...
Придется писать свою DLL.
Старый 09.10.2003, 14:30   #9  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Просто из любопытства.
а BinaryIO вас чем не устраивает?
Старый 09.10.2003, 14:52   #10  
Wing is offline
Wing
Участник
 
12 / 10 (1) +
Регистрация: 08.10.2003
Адрес: Томск
mazzy, Если Вы способны написать пример записи через BinaryIO в LPT? - буду очень благодарен.
Старый 09.10.2003, 15:00   #11  
Lexey is offline
Lexey
Участник
 
59 / 13 (1) ++
Регистрация: 16.05.2002
Вместо смайлик-word естественно должно быть dword. Скрипт накосячил.
Старый 09.10.2003, 15:47   #12  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Я так понимаю, что пример из хелпа вы уже делали
PHP код:
static void Job2(Args _args)
{
    
BinaryIo myfile = new BinaryIo("lpt1:","W");
    if ( 
myfile )
    {
        
myfile.write('test');
    }

у меня на ноутбуке lpt отсутствует.
придет человек, проверим на его нормальном компьютере.
А в чем проблемы?
Старый 10.10.2003, 06:18   #13  
Wing is offline
Wing
Участник
 
12 / 10 (1) +
Регистрация: 08.10.2003
Адрес: Томск
mazzy, Попробовал предложенное - ошибок нет, но и результата никакого нет...
Старый 11.10.2003, 00:54   #14  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
у нас тоже протестировать не получилось поскольку lpt-принтер отсутствует.
код что-то посылает на lpt и ждет ответа с линии. Если ответа нет, то lpt считается занятым (busy).
Аксапта в этот момент ждет и не отвечает.

Ведет себя также как команда DOS
copy file lpt1:



У кого есть lpt принтер? Желательно матричный. Проверьте, пожалуйста.
Не забудьте поставить перевод строки.

PHP код:
static void Job2(Args _args)
{
    
BinaryIo myfile = new BinaryIo("lpt1:","W");
    if ( 
myfile )
    {
        
myfile.write('test\n\r');
    }

Старый 11.10.2003, 00:57   #15  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Изначально опубликовано Wing
mazzy, Попробовал предложенное - ошибок нет, но и результата никакого нет...
Да, и еще одно. Если вы посылаете на лазерный принтер, то надо либо начинать задание, либо посылать перевод страницы. Уже не помню, но по-моему, символ Chr(12). Посмотрите в документации на принтер как выводить текстовый файл.

Или у вас какое то свое устройство на lpt повешено?
Старый 13.10.2003, 06:28   #16  
Wing is offline
Wing
Участник
 
12 / 10 (1) +
Регистрация: 08.10.2003
Адрес: Томск
Устройство не освсем обычное, но и не особо от принтеров отличающееся: термопринтер для печати этикеток.

Вот это пробовал:
PHP код:
static void TestLpt(Args _args)
{
    
BinaryIo myfile = new BinaryIo("lpt1:","W");
    
str ESC Num2Char(27);
    
str CR Num2Char(13);

    if ( 
myfile )
    {
        
myfile.writestrfmt('%1B%2Q048%3S2%4M15%5D5%6?E%7{4750010141021}%8%9E',ESC,ESC,ESC,ESC,ESC,ESC,ESC,CR,ESC) );
        
info('отпечатано?');
    }

То же, отправленное в порт Си++Билдером, выдает на печать этикетку.
Старый 13.10.2003, 07:26   #17  
Wing is offline
Wing
Участник
 
12 / 10 (1) +
Регистрация: 08.10.2003
Адрес: Томск
! Задача изменилась!
Поскольку принтер будет стоять в строго определенном месте, а сама аксапта будет стартовать с тучи разных расположений, было решено сделать сервер для принтера и отсылать ему по сети задачи на печать.
Сервер уже есть и есть рабочая DLL для отправки серверу.
Теперь необходимо реализовать одно из двух:
  1. Подключить эту DLL ( int __stdcall (*Send)(char *, char *, char *, int, char *) )
  2. Найти способ отправлять данные по сети
Может кто что посоветовать?
Напрямую с сокетами аксапта работать может?
С подключением библиотеки я пока не справился... аксапта падает
вот код:
PHP код:
static void TestDLL(Args _args)
{
    
DLL         _winApiDLL     = new DLL('C:\\Projects\\CBuilder\\PrinterEt\\Client\\w_printer_et.dll');
    
DLLFunction _Send          = new DLLFunction(_winApiDLL'SendToPrinterEt');

    
_Send.returns(ExtTypes::DWord);
    
_Send.arg(ExtTypes::Pointer);
    
_Send.arg(ExtTypes::Pointer);
    
_Send.arg(ExtTypes::Pointer);
    
_Send.arg(ExtTypes::DWord);
    
_Send.arg(ExtTypes::Pointer);

    
_Send.call('голова(head)''4750010141021''зад(bottom)'1'guest');

в AxaptaCrash.log такое сообщение:
Stackdump exit code 487 (Попытка обращения к неверному адресу)
кстати int внутри returns не понимается... там понимается только ExtTypes.
Старый 13.10.2003, 07:28   #18  
Wing is offline
Wing
Участник
 
12 / 10 (1) +
Регистрация: 08.10.2003
Адрес: Томск
Post
Сразу поправлюсь:
пути аксапта понимает только с двумя "\\", но этот форум почемуто заменяет 2 на 1.
Старый 13.10.2003, 12:54   #19  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Про сокеты. посмотрите tutorial_TicTacToe
подробно не разбирался. Но сокеты там используются.

Про задачу. Подореваю, что это не последнее изменение вашей задачи.
Не торопитесь исполнять ее в таком виде.
Старый 13.10.2003, 14:09   #20  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Пример
Смотрим класс WinAPI
PHP код:
client server static int getFileAttributes(str name)
{
    
DLL         _winApiDLL          = new DLL('KERNEL32');
    
DLLFunction _getFileAttributes  = new DLLFunction(_winApiDLL'GetFileAttributesA');

    
_getFileAttributes.returns(ExtTypes:: DWORD);
    
_getFileAttributes.arg(ExtTypes::STRING);

    return 
_getFileAttributes.call(name);

Теперь смотрим Win32 Developer's References
DWORD GetFileAttributes(LPCTSTR lpFileName)
Делаем вывод, что для передачи в качестве параметра указателя на строку надо использовать arg(ExtTypes::STRING)
Теги
winapi, файл

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Документация по функциям bucken DAX: Программирование 1 25.11.2003 08:38
Что передается функциям, ссылки или значения? parovoz DAX: Программирование 4 28.08.2003 20:04
поиск по ветвям "доступ к функциям" SAlekseev DAX: Администрирование 2 26.03.2003 13:39

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 08:09.