#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 добавляет aGet
и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(«версия»)]; сработали. Спасибо за вашу помощь!