Ошибка «Функция не принимает 0 аргументов» для определяемой IDL функции propget (которой задан аргумент)

#c #idl

#c #idl

Вопрос:

Я работаю над C DLL, которая использует IDL-файл для взаимодействия с API другой программы. Я пытаюсь вызвать функцию, которая определена следующим образом в .idl другой программы:

 [propget, id(1014), helpstring("The user defined attribute on the feature using the name of the attribute")] HRESULT UserAttribute([in] BSTR attr_id, [out, retval] VARIANT *pVal);
  

Это мой вызов метода в DLL:

 VARIANT *res = udf->UserAttribute(BSTR("version"));
  

Однако, когда я пытаюсь скомпилировать программу, я получаю эту ошибку:

 1>ApplicationSink.cpp(378): error C2660: 'IFMFeature::GetUserAttribute' : function does not take 0 arguments
  

Номер строки указан для строки, которую я процитировал выше; также строка, которую я процитировал выше, является единственной строкой, где метод UserAttribute появляется где угодно в DLL. Итак, я знаю, что ошибка на самом деле не относится к другому месту в коде, где я вызываю ее без аргументов. Кроме того, я без проблем использую многие, многие другие функции из API, поэтому я не думаю, что проблема связана с API в целом. Я также написал макросы VB, которые успешно использовали функцию UserAttribute, поэтому я знаю, что она работает по крайней мере в некоторых случаях.

Я вызываю UserAttribute, но ошибка говорит о GetUserAttribute — может ли это быть потому, что он выполняет какую-то закулисную магию, связанную с тем фактом, что UserAttribute определяется как функция propget? В API не определена функция GetUserAttribute .

Кто-нибудь знает, что здесь происходит и как я могу это исправить?

Комментарии:

1. Вы пробовали ее вызывать GetUserAttribute ? C добавляет a Get и Put для propget propput определений и, но другие языки, такие как VB и C #, могут получать и устанавливать такие свойства без средств доступа Get / Set, просто ссылаясь на имя свойства.

2. Используете ли вы директиву компилятора «#import» для ссылки на ваш интерфейс? Если это так, то да, за вашей спиной происходит какое-то волшебство. Вы можете посмотреть заголовок, который компилятор сгенерировал для вас в промежуточном каталоге. Метод UserAttribute(), вероятно, будет реализован в терминах GetUserAttribute() для обработки возвращаемого значения HRESULT .

3. Обновление: Спасибо за ваш вопрос, сегодня я узнал кое-что новое. В сгенерированном заголовке (.tlh) директива import объявляет UserAttribute как массив со специальным атрибутом компилятора («property»), который обрабатывает параметр, как если бы они были индексами. Итак, в вашем коде у вас есть выбор: udf-> UserAttribute[BSTR(«версия»)]; или udf-> GetUserAttribute(BSTR («версия»)); msdn.microsoft.com/en-us/library/yhfk0thd.aspx

4. Оба udf->GetUserAttribute(BSTR(«версия»)); и udf-> UserAttribute[BSTR(«версия»)]; сработали. Спасибо за вашу помощь!