• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 自动化接口的属性不能正常调用的问题?

自动化接口的属性不能正常调用的问题?

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了接口定义属性,接口有属性吗,java接口定义属性,接口中的属性,接口属性等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 自动化接口的属性不能正常调用的问题?
描述:

  我自己写了一个简单的COM组件, 没有使用MFC, 也没有使用ATL, 只有两个方法, 一个属性, IDL文件如下:


import "oaidl.idl";
import "ocidl.idl";
[
object,
uuid(30278898-6712-4bdf-985F-A1EED2A1C4E9),
pointer_default(unique),
dual
]
interface IDeviceControl : IDispatch
{
[id(1)]
HRESULT Startup([in] BSTR bstrClass);
[id(2)] 
HRESULT Stop([in] BSTR bstrClass);
[propget, id(3)] 
HRESULT UsbClass([out, retval] VARIANT_BOOL* lpbStatus);
[propput, id(3)]
HRESULT UsbClass([in] VARIANT_BOOL bStatus);
};
[
version(1.0),
uuid(165A29C3-986B-48ae-BF92-D676DAD77900)
]
library DeviceControl
{
importlib("stdole2.tlb");
importlib("stdole32.tlb");
[
uuid(B967383B-8002-405a-BB73-5CDC75E0AA3D)
]
coclass DeviceControl
{
[default] interface IDeviceControl;
}
};

在IDispatch接口的GetIdsOfNames()与Invoke()中我是使用的类型库ITypeInfo接口的,代码如下:

STDMETHODIMP CDeviceControl::GetIDsOfNames(
REFIID interfaceId, 
LPOLESTR* lpposzName,
UINT nName, 
LCID intoLcid, 
DISPID* lpDispId)
{
OutputDebugString(L"CDeviceControl::GetIDsOfNames...");
ITypeInfo* pTypeInfo = NULL;
HRESULT hResult = GetTypeInfo(0, GetUserDefaultLCID(), &pTypeInfo);
if (FAILED(hResult))
{
OutputDebugString(L"GetTypeInfo is failed...");
return E_FAIL;
}
hResult = pTypeInfo->GetIDsOfNames(lpposzName, nName, lpDispId);
if (FAILED(hResult))
{
OutputDebugString(L"GetIDsOfNames is failed...");
return E_FAIL;
}
pTypeInfo->Release();
return S_OK;
}
STDMETHODIMP CDeviceControl::Invoke(
DISPID dispId,
REFIID interfaceId, 
LCID infoLcid, 
WORD wFlag, 
DISPPARAMS* lpDispParams, 
VARIANT* lpResultVar, 
EXCEPINFO* lpExpInfo, 
UINT* lpArgErr)
{
ITypeInfo* pTypeInfo = NULL;
HRESULT hResult = GetTypeInfo(0, GetUserDefaultLCID(), &pTypeInfo);
if (FAILED(hResult))
{
OutputDebugString(L"GetTypeInfo is failed...");
return E_FAIL;
}
hResult = pTypeInfo->Invoke(
static_cast<IDeviceControl*>(this), 
dispId, 
wFlag, 
lpDispParams, 
lpResultVar, 
lpExpInfo, 
lpArgErr);
if (FAILED(hResult))
{
OutputDebugString(L"GetIDsOfNames is failed...");
return E_FAIL;
}
pTypeInfo->Release();
return S_OK;
}
STDMETHODIMP CDeviceControl::Startup(BSTR bstrClass)
{
wcout << L"Startup " << bstrClass << endl;
return S_OK;
}
STDMETHODIMP CDeviceControl::Stop(BSTR bstrClass)
{
wcout << L"Stop " << bstrClass << endl;
return S_OK;
}
STDMETHODIMP CDeviceControl::get_UsbClass(VARIANT_BOOL* lpbStatus)
{
*lpbStatus = TRUE;
wcout << L"get_UsbClass status..." << endl;
return S_OK;
}
STDMETHODIMP CDeviceControl::put_UsbClass(VARIANT_BOOL bStatus)
{
if (bStatus)
{
wcout << L"put_UsbClass status startup..." << endl;
}
else
{
wcout << L"put_UsbClass status stop..." << endl;
}
return S_OK;
}

客户端代码如下:

int _tmain(int argc, _TCHAR* argv[])
{
HRESULT hResult = CoInitialize(NULL);
if (FAILED(hResult))
{
wcout << L"CoInitialize is failed..." << endl;
return 1;
}
CComPtr<IDispatch> spDispatch = NULL;
hResult = CoCreateInstance(
CLSID_DeviceControl, 
NULL,
CLSCTX_INPROC_SERVER, 
IID_IDeviceControl, 
reinterpret_cast<PVOID*>(&spDispatch));
if (FAILED(hResult))
{
wcout << L"CoCreateInstance is failed..." << endl;
return 1;
}
DISPID startupDispId = 0;
LPOLESTR poszStartup[1] = {L"Startup"};
hResult = spDispatch->GetIDsOfNames(
IID_NULL, 
poszStartup, 
1, 
GetUserDefaultLCID(), 
&startupDispId);
if (FAILED(hResult))
{
wcout << L"GetIDsOfNames is failed..." << endl;
return 1;
}
cout << startupDispId << endl;
DISPID stopDispId = 0;
LPOLESTR poszStop[1] = {L"Stop"};
hResult = spDispatch->GetIDsOfNames(
IID_NULL, 
poszStop, 
1, 
GetUserDefaultLCID(), 
&stopDispId);
if (FAILED(hResult))
{
wcout << L"GetIDsOfNames is failed..." << endl;
return 1;
}
cout << stopDispId << endl;
DISPPARAMS dispParams = {0};
dispParams.cArgs = 1;
dispParams.rgvarg = new VARIANT[dispParams.cArgs];
if (NULL == dispParams.rgvarg)
{
wcout << L"new VARIANT is failed..." << endl;
return 1;
}
VariantInit(&dispParams.rgvarg[0]);
dispParams.rgvarg[0].vt = VT_BSTR;
dispParams.rgvarg[0].bstrVal = L"USB";
UINT nArgErr = 0;
hResult = spDispatch->Invoke(
startupDispId, 
IID_NULL, 
GetUserDefaultLCID(), 
DISPATCH_METHOD, 
&dispParams, 
NULL, 
NULL, 
&nArgErr);
if (FAILED(hResult))
{
wcout << L"Invoke is failed..." << endl;
return 1;
}
delete dispParams.rgvarg;
dispParams.rgvarg = NULL;
dispParams.cArgs = 1;
dispParams.rgvarg = new VARIANT[dispParams.cArgs];
if (NULL == dispParams.rgvarg)
{
wcout << L"new VARIANT is failed..." << endl;
return 1;
}
VariantInit(&dispParams.rgvarg[0]);
dispParams.rgvarg[0].vt = VT_BSTR;
dispParams.rgvarg[0].bstrVal = L"Stop";
hResult = spDispatch->Invoke(
stopDispId, 
IID_NULL, 
GetUserDefaultLCID(), 
DIS
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 为接口加属性的问题
  • 自动化接口的属性不能正常调用的问题?
  • 一个接口中的一个属性是一个枚举数组,应该怎么实现??

相关文章

  • 2017-06-05 请教CWinThread::Run死循环问题
  • 2017-06-05 抓图与应用进程和服务进程的关系!(基本上很难,高手请进)
  • 2017-06-05 如何使shell释放dll??
  • 2017-06-05 如何避免多次的调用
  • 2017-06-05 菜鸟,请求帮助,关于Resetevent,deng!duoxie
  • 2017-06-04 asp调用activex失败!。。。。。。。。
  • 2017-06-04 高手帮忙!安装老出问题啊,Help!!
  • 2017-06-04 com组件多线程下触发事件的问题
  • 2017-06-04 关于Com的CoGetClassObject函数。
  • 2017-06-04 请教关于COM中属性值为noncreatable的coclass的问题

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 请问谁要ILOG和DSG的LICENSE临时/正式均可,有偿请与我联系:westernsoft@sinacom
    • 我要修改CListBox控件,要怎么做?
    • 进程外和进程内的COM??
    • 求教关于在VS2010里面添加ATL属性页的问题!
    • 关于全局键盘钩子一次按键出现2次调用的问题?
    • ocx控件注册,我想写一个自动注册的脚本
    • 有关dll的数据共享问题
    • vc6中用LoadLibrary使用线程池引起的问题
    • struct里面若有com指针要如何初始化
    • 一百分求助!!WebService中VC6客户端调用C#服务端的小问题!

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有