导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

在VC中只知道CLSID和IID怎么调用对象?

smint 2001-07-17 10:49:41
在VB里可以使用CreateObject来生成COM对象。
如set a = CreateObject("Wscript.Shell")
a.RegDelete ......
怎么在VC里使用呢?
生成一个象a一样的对象?

以下是我的代码:

defination
#include...
const IID IID_WSH_SHELL =
{0xF935DC21,0x1CF0, 0x11d0, {0xAD, 0xB9, 0x00, 0xC0, 0x4F, 0xD5, 0x8A, 0x0B}};

const CLSID CLSID_WSH_SHELL =
{0xF935DC22,0x1CF0, 0x11d0, {0xAD, 0xB9, 0x00, 0xC0, 0x4F, 0xD5, 0x8A, 0x0B}};

EXTERN_C const IID IID_IWScriptShell;

interface DECLSPEC_UUID("F935DC21-1CF0-11d0-ADB9-00C04FD58A0B")

IWScriptShell : public IUnknown
{
public:
virtual LPDISPATCH STDMETHODCALLTYPE GetSpecialFolders() = 0;
virtual LPDISPATCH STDMETHODCALLTYPE GetEnvironment(VARIANT* pvarType) = 0;
virtual long STDMETHODCALLTYPE Run(LPCTSTR bstrCommand, VARIANT* pvarWindowStyle, VARIANT* pvarWaitOnReturn) = 0;
virtual long STDMETHODCALLTYPE Popup(LPCTSTR bstrText, VARIANT* pvarSecondsToWait, VARIANT* pvarTitle, VARIANT* pvarType) = 0;
virtual LPDISPATCH STDMETHODCALLTYPE CreateShortcut(LPCTSTR bstrPathLink) = 0;
virtual LPSTR STDMETHODCALLTYPE ExpandEnvironmentStrings(LPCTSTR bstrSrc) = 0;
virtual VARIANT STDMETHODCALLTYPE RegRead(LPCTSTR bstrName) = 0;
virtual void STDMETHODCALLTYPE RegWrite(LPCTSTR bstrName, VARIANT* pvValue, VARIANT* pvarType) = 0;
virtual void STDMETHODCALLTYPE RegDelete(LPCTSTR bstrName) = 0;
};

usage:
HRESULT sc;
IWScriptShell *pWshShell = NULL;

sc = CoCreateInstance( CLSID_WSH_SHELL, NULL, CLSCTX_SERVER,
IID_WSH_SHELL, (LPVOID *) &pWshShell );
if( FAILED(sc) )
return;

pWshShell->.....(use it)
pWshShell->Release();
但是不行,VC说wshom.ocx Loaded,但是无法使用其中的方法(sc Succeed)
如何解决?
...全文
3249 点赞 收藏 49
写回复
49 条回复
切换为时间正序
请发表友善的回复…
发表回复
smint 2001-07-29
Ö
回复
zch_kitty 2001-07-26
我是搞硬件的,导师不在,去了美国。
师兄的水平很高,可也神龙见首不见尾!
回复
scratch2000 2001-07-26
很简单,包含头文件#include <IWSHom.h>即可
直接使用其中的组件和接口的定义,而不是自己再去生成。
回复
zch_kitty 2001-07-25
大家都是高手,我学了很长时间的vc++,还没学会。
能告诉我怎么学吗?
回复
hecCIBN 2001-07-25
zch_kitty(香水百合):
1、领导分配你一个任务,要求用VC完成;
2、找高手带一把。
回复
dennis_duan 2001-07-23
#import只是生成了接口定义文件,而这个文件仅仅在编译时需要使用,一旦生成可执行文件,就与路径无关了。
换句话说,#import是给编译程序用的,用来生成接口定义文件,编译生成可执行文件后,就与#import中指定的路径无关了。
回复
smint 2001-07-19
能说得详细明了的,请到
http://www.csdn.net/expert/topic/196/196464.shtm
取另100分。
回复
musicdancer 2001-07-19
import只是辅助.
其实只需要一个idl.这才是原始的方式.
回复
smint 2001-07-19
不是的。import必须指定路径。难道这种方式也就是vc的COM方式?我们现在最好就是只有CLSID和IID和它的一些接口,然后来使用。
回复
musicdancer 2001-07-19
SuperChen(兔子)已经说得很清楚了.我的试验也反映IWshShell的定义和你给的不一样.
你无需自己去定义组件接口,使用import方法就产生了相关接口定义(wshom.tlh中).而且也无需你改为.h和include.
至于Debug时有First-Chance Exception.我想可以不用理会.
我在Debug MSDN的sample时也常有这样的问题.
回复
c_z_y 2001-07-18
STDAPI CoCreateInstance(
REFCLSID rclsid, //Class identifier (CLSID) of the object
LPUNKNOWN pUnkOuter, //Pointer to whether object is or isn't part
// of an aggregate
DWORD dwClsContext, //Context for running executable code
REFIID riid, //Reference to the identifier of the interface
LPVOID * ppv //Address of output variable that receives
// the interface pointer requested in riid
);
回复
c_z_y 2001-07-18
CoCreateInstance
回复
smint 2001-07-18
还有如果使用CoCreateInstance的方法,不知道可不可以的?怎么作?
回复
smint 2001-07-18
对的。本来的我的类定义运行后总是说有问题的。或者干脆什么都没有。
回复
SuperChen 2001-07-18
Exception 的問題還沒搞定.

不是不能使用 CoCreateInstance, 關鍵的是那個 Interface(IWshShell) 的定義一定要是正確的, 實際上 IWshShell 和你的定義不同, 其中的真正 Method 的位置和你所定義的有偏差, 所以你調用其中的方法可能因為參數不合要求會出錯.

我寫的那幾行Code只是使用了VC所提供的封裝 COM 常用功能的類, 具體什麼意思可以查一下MSDN, 或者直接到 include 目錄下看一下 comdef.h, comip.h, comutil.h ... 相信很容易理解.
回复
smint 2001-07-18
对的。但是我们只有一个编译好的组件,如wshom.ocx如果要生成正确的定义。怎么做呢?
VB中很简单的。VC中如何来申明呢?又如何生成一个对象的实例呢?
回复
lwg7603 2001-07-18
“不是不能使用 CoCreateInstance, 關鍵的是那個 Interface(IWshShell) 的定義一定要是正確的, 實際上 IWshShell 和你的定義不同, 其中的真正 Method 的位置和你所定義的有偏差, 所以你調用其中的方法可能因為參數不合要求會出錯.”

SuperChen(兔子)的这句话一针见血!这就是出错的原因

回复
lwg7603 2001-07-18
SuperChen(兔子)说的很对!
回复
davidprg 2001-07-18
COM好复杂,没时间玩。。。
回复
lwg7603 2001-07-18
davidprg():
哈哈,看花眼了!对不起大家!
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……