![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
работа в BASIC с объектом из DELPHI DLL
jurez © (2008-07-20 13:10:00)есть простая дллка
library wordinst;
uses
SysUtils,
activex,
comobj,
Classes;
function getword:idispatch; stdcall;
begin
CoInitialize(nil);
result:=CreateOleObject('word.application');
end;
exports getword;
begin
end.
когда вызываю ее из Дельфи же - все нормально
function getw:idispatch; external 'wordinst.dll' name 'getword';
.
.
.
var f:variant;
begin
f:=getw;
f.visible:=true;
f.documents.add;
end;
проблемы начинаются когда вызываю ее из BASIC
Declare Function getword Lib "c:\tmp\wordinst.dll" ()
sub mysub
getword
end sub
в этом случае все нормально - бейсик берет функцию и обрабатывает (процесс ворда появляется)
НО необходимо управлять полученным объектом
Declare Function getword Lib "c:\tmp\wordinst.dll" () as object
sub mysub
getword.visible=true
end sub
приводит к полному вылетанию бейсика!.
кто-нибудь с подобным сталкивался?
jurez (2008-07-23 09:31:00) [1]да поскорее бы прибили
Германн (2008-07-23 02:42:00) [2]
> jurez (22.07.08 23:46) [15]
>
> не удержался..
>
А здря.
Неудержание очень плохая и малолечимая штука. :)
И кстати. Тему могут закрыть, согласно правилам, только модераторы и администратор.
jurez (2008-07-22 23:46:00) [3]не удержался..
Сергей М.ты еще расскажи про позднее связывание...
сарказмом своим свети в другом месте. если это(references) у тебя панацея, то могу только поздравить.
tesseract
понял что написал то?
tesseract (2008-07-21 20:35:00) [4]
> тема закрыта
Жалко, что дикая утечка памяти нет. И потом опять заявляют, что MS глючные программы ваяет.
Сергей М. (2008-07-21 17:18:00) [5]
> References здесь никаким разом не нужны
Да ты что ?! А мужики-то и не знают)
Ты еще скажи, что ничего не знаешь про early binding)
jurez (2008-07-21 16:58:00) [6]про safecall тоже читал ипробовал... References здесь никаким разом не нужны.
"откуда у этого типа свойство visible" - опять же если посмотреть приведенный пример - то видно что усиленно пытаются "экспортить" ворд - у ворда это свойство отвечает за отображение программы..
мой вопрос в конце первого поста звучал довольно ясно- "кто-нибудь с подобным сталкивался?"
пробоему решил - работает в библиотеке как olevariant;stdcall (эту комбинацию видать пропустил) и в бейсике
declare function myfunc...... as variant
dim obj as object
set obj= myfunc
тема закрыта
palva (2008-07-21 13:43:00) [7]
> по существу так пока никто и не написал
Ну значит ваш вопрос никому не интересен или непонятен.
Мне например непонятно, что такое тип object в бейсике (в шестом) и откуда у этого типа свойство visible. Если вы не хотите вступать в дискуссию на эту тему, а ждете готовый код, то продолжайте ждать. Может и появится знаток.
Сергей М. (2008-07-21 12:51:00) [8]
> по существу так пока никто и не написал
>
А "по существу" - работа с OLE/COM-объектами в дан.случае требует либо явное использование библиотеки типов (см. меню References VB-среды) либо использование safecall- вместо stdcall-соглашения. Ни того ни другого ты не сделал.
jurez (2008-07-21 12:37:00) [9]Сергей М.
это я все читал. olevariant не прокатывает тоже..
"Что мешает работать с СОМ-сервером непосредственно в BASIC-коде" - уже второй человек почемуто задается этим вопросом. я на мазохист чтобы специально так извращаться- прятать созхдание ворда в другом месте. :)
нужно чтобы ворд создавался только при определенной платформе, и нужно чтобы это было скрыто в основной бейсиковской программе - для этого забор и городится.
palvaРечь ведется про VB6 - там можно сделать activeX-dll
по существу так пока никто и не написал
Сергей М. (2008-07-21 12:11:00) [10]
> Типы Variant в бейсике и делфи вполне возможно, что работают
> по-разному
Именно так и есть.
> jurez
Справку читать надо, там черным по белому написано:
The OleVariant type exists on both the Windows and Linux platforms. The main difference between Variant and OleVariant is that Variant can contain data types that only the current application knows what to do with. OleVariant can only contain the data types defined as compatible with OLE Automation which means that the data types that can be passed between programs or across the network without worrying about whether the other end will know how to handle the data.
palva (2008-07-21 11:41:00) [11]
> в бейсике дллку придется делать
Вы о каком бейсике говорите? В бейсике обычную dll сделать невозможно. Только com, ну или net, если у вас Basic .Net
palva (2008-07-21 11:39:00) [12]Из делфи в бейсик можно возвращать те типы, которые с которыми может работать тот и другой язык. IDispatch в бейсике нет. object тоже непонятный для VB6 тип - там есть Variant. Типы Variant в бейсике и делфи вполне возможно, что работают по-разному. Короче говоря dll, должна сконструировать и передать в бейсик правильный тип. Для этого нужно четко знать, чего вы хотите.
Сергей М. (2008-07-21 11:30:00) [13]
> в бейсике дллку придется делать
Зачем она нужна вообще?
Что мешает работать с СОМ-сервером непосредственно в BASIC-коде ?
jurez (2008-07-21 10:48:00) [14]tesseract: coinitialize в модуле activex- смотри внимательнее. "вынужден передергивать"... и что??? в программе вызывается один раз метод.
"вызова Countinitialize я в либе не вижу. А ты её в GetWord должен указать"
повторю код еще раз...
function getword:idispatch; stdcall;
begin
CoInitialize(nil);
result:=CreateOleObject('word.application');
end;
Плохиш: а что еще можно информативно добавить к тому что бейсик просто закрывается???!
palva: на самом деле уже как только не изворащался... передавал и Idispatch и к variant приводил - в дельфе работает, а в бейсике нет. походу в бейсике дллку придется делать
palva (2008-07-21 10:12:00) [15]getword возвращает тип object?
А у этого типа есть свойство visible?
Может быть нужно какое-то приведение типов?
Плохиш (2008-07-20 23:06:00) [16]К [1] можно добавить только, что описание
> приводит к полному вылетанию бейсика!.
ну пряму супер информативно.
tesseract (2008-07-20 17:27:00) [17]Ты фигнеё маешься какой-то, почему из бэйсика сразу COM-сервер не вызывать ? Тем более getword вынуждает каждый раз Com-сервер передёргивать. И кстати не CoInitialize а CoInitializeEx и вызова Countinitialize я в либе не вижу. А ты её в GetWord должен указать, ибо функция в Dll должна за собой всё убрать после вызова.