在《COM+指南》一书中的第五章最后一个例子:P127,就是Merlin的那个例子,我按照书本上的写上去
最后说error C2065:'IAgentExPtr':underclared identifier
共有25个errors,都是这个问题
开头的代码如下:
#define _WIN32_DCOM#include <windows.h>
#include <iostream>#include <TCHAR.H>#import "c:\winnt\msagent\agentsvr.exe" no_namespace
#pragma warning(push)
#pragma warning(disable:4290)const long PAUSE_AFTER_SPEAKING=20000;
const BSTR DEFAULT_SPEECH=L"This is a test of the Emergency Broadcast System!!";void SayIt(IAgentExPtr ptrAgent,_bstr_t message_text) throw (_com_error);
//就是这个IAgentExPtr首先出错
int main(int argc,char* argv[])
{
......请问如何做?
但书上没有说,而且,那个Agent是microsoft的一个组件,在winnt下的msagent目录中,不可能有头文件的,里边只有exe文件和dll文件。
以下是接第一个后的全部剩余代码,就这么多了,书上也没有说要做其他的事情:
HRESULT hr;
int n_return=0; try
{
int arg_count=1;
_bstr_t message_text;
IAgentExPtr ptrAgent; hr=CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);
if(FAILED(hr))
{
_com_issue_error(hr);
}
if(argc>arg_count)
message_text=argv[arg_count];
else
message_text=DEFAULT_SPEECH; hr=ptrAgent.CreateInstance(__uuidof(AgentServer));
if(FAILED(hr))
_com_issue_error(hr); SayIt(ptrAgent,message_text);
}
catch(_com_error e)
{
std::cout<"ERROR("<e.Error()<"):";
if(e.Description().length>0)
std::cout<(char*)e.Description()<std::endl;
std::cout<e.ErrorMessage()<std::endl;
n_return=1;
}
CoUninitialize();
return n_return;
}HRESULT CreateAgent(IAgentExPtr& ptrAgent,_bstr_t Machine,COAUTHIDENTITY AuthorId)
{
HRESULT hr; COAUTHINFO author_info;
COSERVERINFO server_info;
MULTI_QI mqi[1]; if(Machine.length()==0)
{
hr=ptrAgent.CreateInstance(__uuidof(AgentServer));
if(FAILED(hr))
_com_issue_error(HR);
}
else
{
ZeroMemory(&author_info,sizeof(author_info));
author_info.dwAuthnSvc=RPC_C_AUTHN_WINNT;
author_info.dwAuthzSvc=RPC_C_CUTHZ_NONE;
author_info.dwImpersonationLevel=RPC_C_IMP_LEVEL_IMPERSONATE;
author_info.dwCapabilities=EOAC_NONE;
author_info.pAuthIdentityData=&AuthorId; ZeroMemory(&server_info,sizeof(server_info));
server_info.pwszName=Machine;
server_info.pAuthInfo=&author_info; ZeroMemory(mqi,sizeof(mqi));
mqi[0].pIID=&__uuidof(IAgentEx);
mqi[0].pItf=static_cast<IUnknown*>(ptrAgent); hr=CoCreateInstanceEx(__uuidof(AgentServer),NULL,CLSCTX_REMOTE_SERVER,&server_info,1,mqi);
if(FAILED(hr))
{
}
else if(FAILED(mqi[0].hr))
{
hr=mqi[0].hr;
ptrAgent=NULL;
}
else
ptrAgent.Attach(reinterpret_cast<IAgentEx*>(mqi[0].pItf));
}
return hr;
}void SayIt(IAgentExPtr ptrAgent,_bstr_t message_text)
{
HRESULT hr=E_FAIL; IAgentCharacterExPtr pCharacter;
IDispatchPtr ptr_idisp_character;
VARIANT var;
VariantInit(&var);
long nCharacterId;
long nRequestId; ptrAgent->Load(var,&nCharacterId,&nRequestId);
VariantClear(&var);
ptrAgent->GetCharacter(nCharacterId,&ptr_idisp_character);
pCharacter-ptr_idisp_character;
ptr_idisp_character.Release(); pCharacter->Show(false,&nRequestId);
pCharacter->Speak(message_text,L"",&nRequestId);
Sleep(PAUSE_AFTER_SPEAKING);
pCharacter->Hide(1L,&nRequestId);
pCharacter.Release();
ptrAgent->Unload(nCharacterId);
}
#pragma warning(pop)
你只是建立一个空的控制台工程,然后再新建一个.cpp文件,再把以上代码copy进去,就编译吗?
如果就这样简单的话,那我这里也是这样,但就是编译出错
我的windows2000Professional
所以在我的机器上就不存在winxp,也不存在xp的系统目录
不知道我该怎么办?
IAgentExPtr类,所以并不需要什么引用文件,它的定义包含在你的
工程的Debug或Release目录中的一个.tli和.tlh文件中。
你可以查看.tlh文件,看看里面有没有该类的定义
一般为如下语句 _COM_SMARTPTR_TYPEDEF(IAgentEx,_uuidof(IAgentEx))
若没有只能说明你import的文件中根本没有引出IAgentEx接口