15.04.2004, 12:15 | #1 |
Участник
|
Вызов DLL из Axapta
Приветствую всех.
Хочу вызывать функцию внешней DLL. Например вот такой: PHP код:
PHP код:
Помогите, плз, найти ошибку...
__________________
С уважением, Tony Green |
|
15.04.2004, 13:54 | #2 |
Участник
|
Обстоятельства изменились. Теперь так: есть пара функций в DLL следующего вида:
PHP код:
PHP код:
PHP код:
Значение регистра ESP не было сохранено при вызове функции 'RetString' в библиотеке DLL 'retdata'. Причиной может являться вызов функции DLL, которая объявлена с неверным числом аргументов. Есть предположения, что это значит и как бороться?
__________________
С уважением, Tony Green |
|
15.04.2004, 14:27 | #3 |
Участник
|
Ура. Ответ нашелся сам в help'e от Delphi в разделе Calling conventions.
При объявлении функций в dll нужно в конце приписать pascal; вместо register, который подразумевается по умолчанию и пропускает параметры через регистры CPU...
__________________
С уважением, Tony Green |
|
15.04.2004, 14:27 | #4 |
----------------
|
Вспомнил
Надо поставить stdcall
function RetString(s: PChar): PChar; stdcall |
|
15.04.2004, 14:35 | #5 |
Участник
|
да. stdcall тоже должен прокатить. он ведь только порядком параметров от pascal отличается...
__________________
С уважением, Tony Green |
|
18.10.2005, 08:53 | #6 |
Участник
|
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 код:
В чем может быть проблема подскажите пожалуйста |
|
18.10.2005, 11:03 | #7 |
Участник
|
Фигня какая-нибудь наверное, типа того, что s - str, а myProc:boolean
C уважением, itfs. |
|
18.10.2005, 11:15 | #8 |
Участник
|
я думаю, ято вряд ли получится передать IAxaptaRecord в качестве параметра в функцию DLL
|
|
18.10.2005, 11:34 | #9 |
Участник
|
Цитата:
Сообщение от 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); } 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 |
Участник
|
здорово. ну тогда придется заводить еще одну сессию через Axapta Business Connector
|
|
18.10.2005, 12:10 | #11 |
Участник
|
Цитата:
Сообщение от belugin
ну тогда придется заводить еще одну сессию через Axapta Business Connector
__________________
Axapta v.3.0 sp5 kr2 |
|
18.10.2005, 12:14 | #12 |
Участник
|
а как еще по записи внутри аксапты получить IAxaptaRecord?
|
|
18.10.2005, 12:20 | #13 |
Участник
|
А, понял! Это конечно.
__________________
Axapta v.3.0 sp5 kr2 |
|