Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

О соглашении о вызве   Найти похожие ветки 

 
Сергей М. ©   (2010-01-29 19:22) [0]

В некоем VBA-модуле мной предполагается декларация внешней моей ф-ции из моей  библ-ки и соответствующий  ее вызов:

Declare Sub "GetSomeAutoObject" ... Lib "MyDelphiLib.DLL" ... As Object
..
Dim SomeObject As Object
Set SomeObject = GetSomeAutoObject

Предполагаю что соответствующая экспортируемая мной ф-ция GetSomeAutoObject в моём модуле MyDelphiLib.DLL должна быть объявлена мной как

function GetSomeAutoObject(var obj): HResult; stdcall; // safecall convention

Попытка вызова этой эксп.ф-ции из моего же дельфийского приложения успешен.

Попытка ее же вызова в вышеприведенном VBA-коде приводит к краху вызывающего приложения.

Понимаю что проблема - в правильном сопряжении на уровне соглашения о вызове.

На какие я грабли наступил ?


 
Дмитрий С ©   (2010-01-29 19:36) [1]

Могу ошибаться, но судя по примерам из сети в delphi функцию нужно объявить так:

function GetSomeAutoObject: OleVariant; stdcall;


 
Ганя   (2010-01-29 19:46) [2]


> Дмитрий С ©   (29.01.10 19:36) [1]


Тогда уж наверно
function GetSomeAutoObject: OleVariant; safecall;


 
Дмитрий С ©   (2010-01-29 19:53) [3]


> Ганя   (29.01.10 19:46) [2]

Именно stdcall.

safecall - это из COM-а, а он тут не причем. В тех же примерах из сети аналогичным образом вызываются функции, например, из kernel32.dll, а уж там они точно stdcall.


 
Сергей М. ©   (2010-01-29 19:56) [4]

Увы, не работает.
С тем же результатом - крахом вызывающего VBA-приложения.


 
Дмитрий С ©   (2010-01-29 20:16) [5]


> Сергей М. ©   (29.01.10 19:56) [4]

Специально для тебя набросал пример, который работает. (проверил в VBA екселя).

В Excel:


Private Declare Function GetMyObject Lib "C:\Users\Dima\Documents\RAD Studio\Projects\TestVBACall\TestVBACall.dll" () As Variant

Sub Test()
Dim MyObj
Set MyObj = GetMyObject
MyObj.Test ("Привет")
End Sub


В Delphi:


library TestVBACall;

uses
 Windows,
 ObjComAuto;

{$METHODINFO ON}

type
 TTestObject=class
   procedure Test(S: String);
 end;

{ TTestObject }

procedure TTestObject.Test;
begin
 MessageBox(GetActiveWindow, PChar(S), "Test", 0);
end;

function GetMyObject: OleVariant; stdcall;
begin
 Result := TObjectDispatch.Create(TTestObject.Create, True) as IDispatch;
end;

exports
 GetMyObject;

begin
end.



Я думаю ошибка была в типе возвращаемого значения у тебя.


 
Сергей М. ©   (2010-01-29 20:37) [6]


> Дмитрий С ©   (29.01.10 20:16) [5]


Private Declare Function ... As Variant

Sub Test()
Dim MyObj
Set MyObj = GetMyObject
End Sub


при запусе Test() Access2000 VBA на эту конструкцию  заявляет : Run-time error 13 : Type mismatch


 
Дмитрий С ©   (2010-01-29 20:43) [7]


> Сергей М. ©   (29.01.10 20:37) [6]

Именно на эту?

Где б взять Access 2000, проверить.


 
Дмитрий С ©   (2010-01-29 20:45) [8]

P.S. Я проверял в 2007 Excel-е и Access-e.


 
Сергей М. ©   (2010-01-29 21:34) [9]


> Дмитрий С ©   (29.01.10 20:43) [7]
> Именно на эту?


Именно на эту.


 
Сергей М. ©   (2010-01-30 18:14) [10]


> Дмитрий С


Итак эта беда

Declare Function ... As Variant

Sub Test()
Dim MyObj As Object
Set MyObj = GetMyObject
End Sub


заработала.

Однако она не решает вопроса с передачей в вызывающий VBA-код OLE-исключений, которые может возбудить вызываемый при, например, невозможности по каким-либо причинам вернуть диспинтерфейс запрошенного объекта


 
Дмитрий С ©   (2010-01-31 07:51) [11]


> Сергей М. ©   (30.01.10 18:14) [10]

Это ж не Ole.
Что мешает использовать нормальный Ole (т.е. COM)?


 
Anatoly Podgoretsky ©   (2010-01-31 11:34) [12]

Я немного полазил по MSDN пытаясь найти примеры и информацию по взаимодействию C++ и VBA - нет ее, что в очередной раз подтведило слухи, что МС убил/убивает C++
Вот по С# очень много информации и даже подчеркнуто, что передачас строк в VBA не представляет проблемы в отличии от С++, поскольку используется прямой синтаксис в VBA S as string или как там в С# объявляются строки в параметрах.


 
Сергей М. ©   (2010-01-31 18:44) [13]


> Дмитрий С ©   (31.01.10 07:51) [11]


> Что мешает использовать нормальный Ole (т.е. COM)?


Мне - ничто.
А можно ли хотя бы в общих чертах, в чем, по твоему имху, заключается "нормальный olle (т.е. COM)" ?



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.084 c
15-1265999141
OneYoungMan
2010-02-12 21:25
2010.08.27
Linux для старого компьютера...


4-1237892274
Alx2k
2009-03-24 13:57
2010.08.27
Получить оверлейный значок


15-1266528605
Юрий
2010-02-19 00:30
2010.08.27
С днем рождения ! 19 февраля 2010 пятница


3-1242650536
kyn66
2009-05-18 16:42
2010.08.27
Полосатый TDBGridEh


2-1273183195
Light-blr
2010-05-07 01:59
2010.08.27
Переход стрелочками между окошками





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский