在《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[])
{
  ......请问如何做?

解决方案 »

  1.   

    我没有看过这本书,不过应该是IAgentExPtr的说明文件(头文件)没有被引用!
      

  2.   

    是的,没有引用
    但书上没有说,而且,那个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)
      

  3.   

    那就奇怪
    你只是建立一个空的控制台工程,然后再新建一个.cpp文件,再把以上代码copy进去,就编译吗?
    如果就这样简单的话,那我这里也是这样,但就是编译出错
    我的windows2000Professional
      

  4.   

    xp目录不是WINXP吗?你找到你引用的那个文件,确定路径是不是正确的。是应该在XP系统里面的。
      

  5.   

    以上我的说法有一点错误,我的系统是2000Server而不是Professional
    所以在我的机器上就不存在winxp,也不存在xp的系统目录
    不知道我该怎么办?
      

  6.   

    #import指令将会自动为程序生成类的包装器,这个包装器应该就是
    IAgentExPtr类,所以并不需要什么引用文件,它的定义包含在你的
    工程的Debug或Release目录中的一个.tli和.tlh文件中。
    你可以查看.tlh文件,看看里面有没有该类的定义
    一般为如下语句 _COM_SMARTPTR_TYPEDEF(IAgentEx,_uuidof(IAgentEx))
    若没有只能说明你import的文件中根本没有引出IAgentEx接口