Конференция "Основная" » работа в BASIC с объектом из DELPHI DLL
 
  • jurez (20.07.08 13:10) [0]
    есть простая дллка
    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

    приводит к полному вылетанию бейсика!.

    кто-нибудь с подобным сталкивался?
  • tesseract © (20.07.08 17:27) [1]
    Ты фигнеё маешься какой-то, почему из бэйсика сразу COM-сервер не вызывать ? Тем более getword вынуждает каждый раз Com-сервер передёргивать. И кстати не CoInitialize а CoInitializeEx и вызова Countinitialize я в либе не вижу. А ты её в GetWord должен указать, ибо функция в Dll должна за собой всё убрать после вызова.
  • Плохиш © (20.07.08 23:06) [2]
    К [1] можно добавить только, что описание

    > приводит к полному вылетанию бейсика!.

    ну пряму супер информативно.
  • palva © (21.07.08 10:12) [3]
    getword возвращает тип object?
    А у этого типа есть свойство visible?
    Может быть нужно какое-то приведение типов?
  • jurez (21.07.08 10:48) [4]
    tesseract: coinitialize в модуле activex- смотри внимательнее. "вынужден передергивать"... и что??? в программе вызывается один раз метод.
    "вызова Countinitialize я в либе не вижу. А ты её в GetWord должен указать"
    повторю код еще раз...
    function getword:idispatch; stdcall;
    begin
    CoInitialize(nil);
    result:=CreateOleObject('word.application');
    end;

    Плохиш: а что еще можно информативно добавить к тому что бейсик просто закрывается???!

    palva: на самом деле уже как только не изворащался... передавал и Idispatch и к variant приводил - в дельфе работает, а в бейсике нет. походу в бейсике дллку придется делать
  • Сергей М. © (21.07.08 11:30) [5]

    > в бейсике дллку придется делать


    Зачем она нужна вообще ?
    Что мешает работать с СОМ-сервером непосредственно в BASIC-коде ?
  • palva © (21.07.08 11:39) [6]
    Из делфи в бейсик можно возвращать те типы, которые с которыми может работать тот и другой язык. IDispatch в бейсике нет. object тоже непонятный для VB6 тип - там есть Variant. Типы Variant в бейсике и делфи вполне возможно, что работают по-разному. Короче говоря dll, должна сконструировать и передать в бейсик правильный тип. Для этого нужно четко знать, чего вы хотите.
  • palva © (21.07.08 11:41) [7]

    > в бейсике дллку придется делать

    Вы о каком бейсике говорите? В бейсике обычную dll сделать невозможно. Только com, ну или net, если у вас Basic .Net
  • Сергей М. © (21.07.08 12:11) [8]

    > Типы 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.
  • jurez (21.07.08 12:37) [9]
    Сергей М.
    это я все читал. olevariant не прокатывает тоже..
    "Что мешает работать с СОМ-сервером непосредственно в BASIC-коде"  - уже второй человек почемуто задается этим вопросом. я на мазохист чтобы специально так извращаться- прятать созхдание ворда в другом месте. :)
    нужно чтобы ворд создавался только при определенной платформе, и нужно чтобы это было скрыто в основной бейсиковской программе - для этого забор и городится.

    palva Речь ведется про VB6  - там можно сделать activeX-dll

    по существу так пока никто и не написал
  • Сергей М. © (21.07.08 12:51) [10]

    > по существу так пока никто и не написал
    >


    А "по существу" - работа с OLE/COM-объектами в дан.случае требует либо явное использование библиотеки типов (см. меню References VB-среды) либо использование safecall- вместо stdcall-соглашения. Ни того ни другого ты не сделал.
  • palva © (21.07.08 13:43) [11]

    > по существу так пока никто и не написал

    Ну значит ваш вопрос никому не интересен или непонятен.
    Мне например непонятно, что такое тип object в бейсике (в шестом) и откуда у этого типа свойство visible. Если вы не хотите вступать в дискуссию на эту тему, а ждете готовый код, то продолжайте ждать. Может и появится знаток.
  • jurez (21.07.08 16:58) [12]
    про safecall тоже читал ипробовал...  References здесь никаким разом не нужны.

    "откуда у этого типа свойство visible"  - опять же если посмотреть приведенный пример - то видно что усиленно пытаются "экспортить" ворд - у ворда это свойство отвечает за отображение программы..

    мой вопрос в конце первого поста звучал довольно ясно- "кто-нибудь с подобным сталкивался?"

    пробоему решил  - работает в библиотеке как olevariant;stdcall (эту комбинацию видать пропустил) и в бейсике
    declare function myfunc...... as variant

    dim obj as object
    set obj= myfunc

    тема закрыта
  • Сергей М. © (21.07.08 17:18) [13]

    > References здесь никаким разом не нужны


    Да ты что ?! А мужики-то и не знают)
    Ты еще скажи, что ничего не знаешь про early binding)
  • tesseract © (21.07.08 20:35) [14]

    > тема закрыта


    Жалко, что дикая утечка памяти нет. И потом опять заявляют, что MS глючные программы ваяет.
  • jurez (22.07.08 23:46) [15]
    не удержался..

    Сергей М. ты  еще расскажи про позднее связывание...
    сарказмом  своим свети в другом месте. если это(references) у тебя панацея, то могу только поздравить.

    tesseract
    понял что написал то?
  • Германн © (23.07.08 02:42) [16]

    > jurez   (22.07.08 23:46) [15]
    >
    > не удержался..
    >

    А здря.
    Неудержание очень плохая и малолечимая штука. :)

    И кстати. Тему могут закрыть, согласно правилам, только модераторы и администратор.
  • jurez (23.07.08 09:31) [17]
    да поскорее бы прибили
 
Конференция "Основная" » работа в BASIC с объектом из DELPHI DLL
Есть новые Нет новых   [134491   +13][b:0][p:0.001]