Ошибка «Класс не поддерживает автоматизацию» при использовании собственного класса из JScript - PullRequest
0 голосов
/ 30 октября 2009

У меня есть проект, который предоставляет объектную модель для использования различными типами клиентов. Написанный в .Net 3.5 он предоставляет классы для COM. Проблема в том, что, кажется, все работает с тестового клиента VB6, я столкнулся со странными ошибками при попытке автоматизировать его с помощью JScript и Windows Script Host.

Вот фрагмент кода:

var scComponent = new ActiveXObject("Mine.SCComponent");
var Prescription = new ActiveXObject ("Mine.CardHolderNewServedPrescriptionData");

Prescription.DiagnosisId = "Test Diagnosis";
Prescription.Date = "2009-01-01";

Prescription.DrugId = 1121;
Prescription.LpuId = 19;
Prescription.Number = 1024;
Prescription.OperatorId = 0;
Prescription.PhysicianId = 13;
Prescription.Quantity = 800;
Prescription.Series = 144;
//Prescription.ServedDate = "2009-01-01";
//Prescription.ServedDrugId = 1123;
//Prescription.ServedQuantity = 600;
//Prescription.Status = 0;
//Prescription.RecourseDate = "2009-01-01";

var addResult = scComponent.AddCardHolderServedPrescription(Prescription);

При запуске программы возникли следующие проблемы:

  • закомментированные строки с ошибкой «Объект не поддерживает такое свойство или метод»
  • Prescription.Date определяется как System.DateTime, но назначение JScript Date здесь не работает - но, похоже, оно принимает (или как-то преобразуется) строковую дату.
  • Последняя строка с вызовом AddCardHolderServedPrescription завершается с ошибкой «Класс не поддерживает автоматизацию».

Вызовы к другим методам scComponent проходят корректно, поэтому я полагаю, что есть некоторые проблемы с типом CardHolderNewServedPrescriptionData. Теперь мне нужны некоторые подсказки, чтобы устранить ее - сообщения об ошибках скрипта не слишком информативны. Поиски в Google не дают значимой информации о методах диагностики.

Опять же, это работает как в моих тестах C #, так и в клиенте VB6, но не в JScript. Спасибо за любые идеи.

Определения типов и фрагменты интерфейса приведены ниже.

[Guid("08D183AF-BE28-4638-BAC0-C568C0FEAD45")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ICardHolderNewServedPrescriptionData
{
    int Series { get; set; }
    int Number { get; set; }
    DateTime Date { get; set; }
    string DiagnosisId { get; set; }
    int DrugId { get; set; }
    int Quantity { get; set; }
    int LpuId { get; set; }
    int PhysicianId { get; set; }
    int OperatorId { get; set; }
    int CategoryId { get; set; }
    int Status { get; set; }
    DateTime RecourseDate { get; set; }
    DateTime ServedDate { get; set; }
    int ServedDrugId { get; set; }
    int ServedQuantity { get; set; }
}

[Guid("E0842E24-163E-4580-9AD6-1593F781D314")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("Mine.CardHolderNewServedPrescriptionData")]
public class CardHolderNewServedPrescriptionData : ICardHolderNewServedPrescriptionData
{
    public int Series { get; set; }
    public int Number { get; set; }
    public DateTime Date { get; set; }
    public string DiagnosisId { get; set; }
    public int DrugId { get; set; }
    public int Quantity { get; set; }
    public int LpuId { get; set; }
    public int PhysicianId { get; set; }
    public int OperatorId { get; set; }
    public int CategoryId { get; set; }
    public int Status { get; set; }
    public DateTime RecourseDate { get; set; }
    public DateTime ServedDate { get; set; }
    public int ServedDrugId { get; set; }
    public int ServedQuantity { get; set; }
}

[Guid("7C1331D7-320D-4201-889C-AF56BFE0D71A")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("Mine.SCComponent")]
public class SCComponent : ISCComponent
{
/*class logic goes here*/
        public int AddCardHolderServedPrescription(CardHolderNewServedPrescriptionData newServedPrescriptionData)
    {
/*method body*/
            }
    }

1 Ответ

0 голосов
/ 30 октября 2009

Ну, после еще нескольких часов отладки и переписывания скрипта - это моя вина. Проблема заключалась в том, что другой класс был зарегистрирован с тем же ProgID, «Mine.CardHolderNewServedPrescriptionData» в той же библиотеке, и у него есть некоторые свойства с такими же сигнатурами, что добавило путаницу.

Таким образом, единственная рекомендация, которую я мог бы дать в будущем, - это точность с ProgID (без проверки автоматически) и проверка самого объекта в отладчике сценария (wscript // X для запуска сценария в режиме отладки)

...