Как сделать в делфи такое (код VBA, вызов COM)
От: Hegemon  
Дата: 10.12.04 11:20
Оценка:
Добрый день, есть кусок куда в VBA нужно сделать то-же самое но в делфи, подскажите как.

з.ы. сам объект на другом компутере


'Вызов и формирование объекта интерфейса
  Dim obj As Object
  Dim Person As String, ClientID As String, RequestID As String

  On Error Resume Next
    Set obj = CreateObject("MYDCOMServer.MYServer") 'Создание объекта
    If Not IsObject(obj) Then
      MsgBox "Модуль интерфейса не установлен или установлен неправильно", vbInformation
      Score = False
      Set obj = Nothing 'Освобождение памяти от объекта интерфейса
      Exit Function

    Else

      Person = "AA"
      ClientID = "" 'Параметр зарезервирован для будущих версий
      RequestID = "" 'Параметр зарезервирован для будущих версий
      
      Call obj.Scoring(ClientID, RequestID, Person, seminputstring, semoutputstring)   'Вызов метода объекта



Написал так:

var
 fScoring : OleVariant;
  fTmpStr: String ;
begin
  fScoring := CreateOleObject('MYDCOMServer.MYServer');
  try
    fScoring.Scoring('', '', 'AA', '', '1', fTmpStr) ;
  finally
    fScoring := UnAssigned ;
  end ;
end;


Однако при выполнении строки fScoring.Scoring('', '', 'AA', '', fTmpStr) ;


происходит эксепшен с сообщение "Разрушительный сбой"
Re: Как сделать в делфи такое (код VBA, вызов COM)
От: kavlad Россия http://www.wavesoft.ru
Дата: 10.12.04 12:07
Оценка:
Здравствуйте, Hegemon, Вы писали:

Вообще-то AnsiString не может быть передан как параметр матода COM-объекта. Паскалевский String надо преобразовать в WideString.
Смотри в сторону

function StringToOleStr(const Source: string): PWideChar;
... По ушам лупит начальство
Re[2]: Как сделать в делфи такое (код VBA, вызов COM)
От: Hegemon  
Дата: 14.12.04 06:46
Оценка:
Чето не работает...


Здравствуйте, kavlad, Вы писали:

K>Здравствуйте, Hegemon, Вы писали:


K>Вообще-то AnsiString не может быть передан как параметр матода COM-объекта. Паскалевский String надо преобразовать в WideString.

K>Смотри в сторону

K>
K>function StringToOleStr(const Source: string): PWideChar;
K>
Re[3]: Как сделать в делфи такое (код VBA, вызов COM)
От: Leonid Troyanovsky  
Дата: 14.12.04 07:34
Оценка:
Здравствуйте, Hegemon, Вы писали:

H>Чето не работает...


Ну, дык, видимо, и пустые строки передавать
надо как OleString.
--
С уважением, LVT
Re[4]: Как сделать в делфи такое (код VBA, вызов COM)
От: Hegemon  
Дата: 14.12.04 09:10
Оценка:
LT> Ну, дык, видимо, и пустые строки передавать
LT> надо как OleString.

А как их передать? напишите пример кода
Re[5]: Как сделать в делфи такое (код VBA, вызов COM)
От: kavlad Россия http://www.wavesoft.ru
Дата: 14.12.04 10:00
Оценка:
Здравствуйте, Hegemon, Вы писали:

LT>> Ну, дык, видимо, и пустые строки передавать

LT>> надо как OleString.

H>А как их передать? напишите пример кода


var
  FileName, OldStr, S, Replace: OleVariant;
begin
    ...
    WordApplication.Connect;
    FileName := WorkDir + 'Header.rtf';
    WordApplication.Documents.Open(FileName, EmptyParam, EmptyParam, EmptyParam,
      EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
      EmptyParam);
    Replace := 1;
    No := False;
    FileFormat := 6; // RTF-файл
    //  Заполняем параметры
    OldStr := '[ADDRESS]';
    S := DataSet.FieldByname('ADDRESS').AsString;
    Range_ := WordApplication.ActiveDocument.Range(EmptyParam, EmptyParam);
    Range_.Find.Execute(OldStr, EmptyParam, EmptyParam, EmptyParam,
      EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, S, Replace,
      EmptyParam, EmptyParam, EmptyParam, EmptyParam);
    ...
end;
... По ушам лупит начальство
Re[6]: Как сделать в делфи такое (код VBA, вызов COM)
От: Hegemon  
Дата: 14.12.04 10:13
Оценка:
Спасибо, но все равно происходит разрушительный сбой...
Re[7]: Как сделать в делфи такое (код VBA, вызов COM)
От: Hegemon  
Дата: 14.12.04 11:07
Оценка:
ISEMServer = interface(IDispatch)
['{289FCFF1-A846-11D6-AE04-000103189EA7}']
procedure Scoring(const ClientID: WideString; const RequstID: WideString;
const Person: WideString; const InP: WideString; out OutP: OleVariant); safecall;
end;
Re[8]: Как сделать в делфи такое (код VBA, вызов COM)
От: Romkin  
Дата: 14.12.04 16:03
Оценка:
Здравствуйте, Hegemon, Вы писали:

H> ISEMServer = interface(IDispatch)

H> ['{289FCFF1-A846-11D6-AE04-000103189EA7}']
H> procedure Scoring(const ClientID: WideString; const RequstID: WideString;
H> const Person: WideString; const InP: WideString; out OutP: OleVariant); safecall;
H> end;

А ты что в последнем параметре передаешь?! Строку?

var
 fScoring, Res : OleVariant;
  fTmpStr: String ;
begin
  fScoring := CreateOleObject('MYDCOMServer.MYServer');
  fScoring.Scoring('', '', 'AA', '', Res) ;
end;


И, разумеется, примечание:
1. Кто сказал, что Delphi не может сама преобразовать строку в WideString?! Все нормально делается
2. При выходе интерфейса из области видимости он также освобождается, unassigned присваивать не надо (но можно, если очень хочется)
Re[9]: Как сделать в делфи такое (код VBA, вызов COM)
От: Hegemon  
Дата: 15.12.04 07:02
Оценка:
Здравствуйте, Romkin, Вы писали:
R>И, разумеется, примечание:
R>1. Кто сказал, что Delphi не может сама преобразовать строку в WideString?! Все нормально делается
R>2. При выходе интерфейса из области видимости он также освобождается, unassigned присваивать не надо (но можно, если очень хочется)

Мля оказывается надо было правильно заполнить 4 параметр
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.