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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.04.2004, 12:15   #1  
Tony Green is offline
Tony Green
Участник
Аватар для Tony Green
 
184 / 25 (1) +++
Регистрация: 08.10.2002
Адрес: Москва
? Вызов DLL из Axapta
Приветствую всех.

Хочу вызывать функцию внешней DLL. Например вот такой:

PHP код:
library q;

{
$R *.res}

function 
ReturnCode(codeString): String;
begin
  result 
:= code;
end;

exports
  ReturnCode
;

begin
end

Вызываю из аксапты вот таким способом:

PHP код:
    DLL         q  = new DLL('c:\\q.dll');
    
DLLFunction f  = new DLLFunction(q'ReturnCode');
    
str         s;
    ;

    
f.returns(ExtTypes::String);
    
f.arg(ExtTypes::String);

    
f.call('test string');

    print(
s);
    
pause
На строчке с call аксапта валится и при этом в crash log появляется запись: Stackdump exit code 487 (Attempt to access invalid address)

Помогите, плз, найти ошибку...
__________________
С уважением,
Tony Green
Старый 15.04.2004, 13:54   #2  
Tony Green is offline
Tony Green
Участник
Аватар для Tony Green
 
184 / 25 (1) +++
Регистрация: 08.10.2002
Адрес: Москва
Обстоятельства изменились. Теперь так: есть пара функций в DLL следующего вида:

PHP код:
function RetString(sPChar): PChar;
begin
  result 
:= s;
end;

function 
RetInteger(iInteger): Integer;
begin
  result 
:= i;
end
При их вызове из axapta вот таким путём:
PHP код:
retString.returns(ExtTypes::String);
retString.arg(ExtTypes::String);
retString.call('My String'); 
или вот так соответственно:
PHP код:
retInteger.returns(ExtTypes::DWord);
retInteger.arg(ExtTypes::DWord);
retInteger.call(2); 
получаем ошибку:
Значение регистра ESP не было сохранено при вызове функции 'RetString' в библиотеке DLL 'retdata'. Причиной может являться вызов функции DLL, которая объявлена с неверным числом аргументов.

Есть предположения, что это значит и как бороться?
__________________
С уважением,
Tony Green
Старый 15.04.2004, 14:27   #3  
Tony Green is offline
Tony Green
Участник
Аватар для Tony Green
 
184 / 25 (1) +++
Регистрация: 08.10.2002
Адрес: Москва
Ура. Ответ нашелся сам в help'e от Delphi в разделе Calling conventions.

При объявлении функций в dll нужно в конце приписать pascal; вместо register, который подразумевается по умолчанию и пропускает параметры через регистры CPU...

__________________
С уважением,
Tony Green
Старый 15.04.2004, 14:27   #4  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Вспомнил
Надо поставить stdcall
function RetString(s: PChar): PChar; stdcall
Старый 15.04.2004, 14:35   #5  
Tony Green is offline
Tony Green
Участник
Аватар для Tony Green
 
184 / 25 (1) +++
Регистрация: 08.10.2002
Адрес: Москва
да. stdcall тоже должен прокатить. он ведь только порядком параметров от pascal отличается...
__________________
С уважением,
Tony Green
Старый 18.10.2005, 08:53   #6  
velk is offline
velk
Участник
 
194 / 10 (1) +
Регистрация: 17.05.2004
!
static void Job10(Args _args)
{
DLL q1 = new DLL(Xinfo::directory(DirectoryType::INCLUDE)+'template\\kvl\\project1.dll');
DLLFunction f = new DLLFunction(q1, 'MyProc');
str s;
CustTable CustTable;
COM axaptaAppl;
COM axaptaCustTable;
;
axaptaAppl = new COM("AxaptaCOMConnector.Axapta");

axaptaAppl.logon("qwerty");

axaptaCustTable = axaptaAppl.CreateRecord("CustTable");
axaptaCustTable.ExecuteStmt("select CustTable");

f.returns(ExtTypes::Byte);
f.arg(ExtTypes::String,ExtTypes::String,ExtTypes::String,(axaptaCustTable));

try
{
s = f.call('qwerty','','',axaptaCustTable);
Здесь вываливается ошибка в несовместимости типов.....
}
catch(Exception::Error)
{
}

}

в DLL есть функция
PHP код:
function MyProc(usernamepass:pchar;report:pchar;_AxaptaQuery:IAxaptaRecord):booleanstdcall;pascal

В чем может быть проблема подскажите пожалуйста
Старый 18.10.2005, 11:03   #7  
itfs is offline
itfs
Участник
 
277 / 43 (2) +++
Регистрация: 18.07.2005
Адрес: Moscow
Фигня какая-нибудь наверное, типа того, что s - str, а myProc:boolean

C уважением, itfs.
Старый 18.10.2005, 11:15   #8  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
я думаю, ято вряд ли получится передать IAxaptaRecord в качестве параметра в функцию DLL
Старый 18.10.2005, 11:34   #9  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от belugin
я думаю, ято вряд ли получится передать IAxaptaRecord в качестве параметра в функцию DLL
Хе-хе. Я тоже так думал, но против лома помогает другой лом.
Вот пример с Excel и Delphi
X++:
static void Job33(Args _args)
{
    ComExcelDocument_RU excel = new ComExcelDocument_RU();
    ComVariant      cv;
    Com             doc;
    Com             app;
    ComInterface    ci;
    DLL             _DLL      = new DLL("COMCall.dll");
    DllFunction     dllfunc = new DllFunction(_dll, "ComObject");
    ;
    excel.newFile();
    excel.visible(false);
    doc = excel.getComDocument();
    app = doc.Application();
    cv = ComVariant::createFromCOM(app);
    ci = cv.iDispatch();
    DllFunc.returns(ExtTypes::DWord);
    DllFunc.arg(ExtTypes::DWord);
    DllFunc.Call(ci);
}
Исходный текст dll на Delphi
X++:
library ComCall;

uses
  Windows,
  ExcelXP;

function ComObject(Int : IDispatch) : Boolean; stdcall;
var
  app : _Application;
begin
  Result := False;
  if Int <> nil then
  begin
    int.QueryInterface(IID__Application, app);
    if app <> nil then
    begin
      app.Visible[GetUserDefaultLCID] := True;
      app.Range['a1', 'a1'].Value2 := '?????';
      app := nil;
    end;
  end;
end;

exports
  ComObject;

begin
end.
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: gl00mie (1).
Старый 18.10.2005, 11:57   #10  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
здорово. ну тогда придется заводить еще одну сессию через Axapta Business Connector
Старый 18.10.2005, 12:10   #11  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от belugin
ну тогда придется заводить еще одну сессию через Axapta Business Connector
Зачем?
__________________
Axapta v.3.0 sp5 kr2
Старый 18.10.2005, 12:14   #12  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
а как еще по записи внутри аксапты получить IAxaptaRecord?
Старый 18.10.2005, 12:20   #13  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
А, понял! Это конечно.
__________________
Axapta v.3.0 sp5 kr2
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Axapta Lessons: Axapta DLLs Blog bot DAX Blogs 0 28.10.2006 18:22
Вызов экспортируемой функции DLL Jabberwocky DAX: Программирование 8 12.09.2006 17:20
Axapta выдает ошибку, что AxCom.dll не зарегистр,хотя... yooshi DAX: Функционал 1 31.10.2005 17:48
Использование функций DLL in Axapta ddadream DAX: Функционал 1 29.07.2003 13:54
Введение в Аксапту Роман Кошелев DAX: Прочие вопросы 0 18.12.2001 14:00

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

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

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