2016-02-04 6 views
0

Извините, о какой-то неопределенной информации об этом вопросе, сначала в библиотеке фактического типа, с которой я работаю, предоставляется соглашение о неразглашении, во-вторых, у меня нет прямого доступа к система, в которой происходит эта проблема.COM-вызов, работающий с ошибками XP Приложение Win7

У меня есть что-то вроде следующего TLB для COM-интерфейса устройства я говорю в Free Pascal:

Device = interface(IDispatch) 
    // ... 
    function GetSubsystem: Subsystem; safecall; 
    property Subsystem: Subsystem read GetSubsystem; 
    // ... 
end; 

Subsystem = interface(IDispatch) 
    // ... 
    function GetSensors: Sensors; safecall; 
    property Sensors: Sensors read GetSensors; 
    // ... 
end; 

Sensors = interface(IDispatch) 
    // ... 
    function GetListItem(index: OleVariant): Sensor; safecall; 
    property ListItem[index: OleVariant]: Sensor read GetListItem; default; 
    // ... 
end; 

Sensor = interface(IDispatch) 
    // ... 
    function GetValue: Double; safecall; 
    property Value: Double read GetValue; 
    // ... 
end; 

Если я прочитал (в соответствии с инструкцией изготовителя) значение одного из датчиков на Windows XP 32bit следующим образом:

d := MyDevice.Subsystem.Sensors['ID23'].Value; 

это работает нормально.

В Windows 7 64 бит у производителя по-прежнему имеется 32-битный COM-интерфейс, а все остальные вызовы из моего 32-разрядного exectuable работают нормально - только одно выше делает мой исполняемый сбой. Он даже не вызывает исключения, он просто падает. То же самое происходит с

var o: oleVariant; 
// ... 
o = 'ID23'; 
d := MyDevice.Subsystem.Sensors[o].Value; 

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

Интересно, что другие языки программирования с использованием этого же COM-интерфейса на Win7 64bit не показать эту проблему.

Есть ли у кого-нибудь советы относительно того, как подойти к этой проблеме при данных обстоятельствах?

ответ

0

Я могу только дать вам несколько советов, чтобы попытаться/Опасайтесь:

  • FPC 3.0 поддерживает исключения SEH для 64-разрядных, но не для 32-битных
  • FPC, кажется, есть некоторые проблемы с свойства по умолчанию для интерфейсов отправки. Попробуйте использовать getlistitem() напрямую.