想成为COM高手请来讨论几个问题,高分相送

Kylix_XP 2002-06-08 04:58:04
这是BCB自带的一个关于Automation技术的问题:
1.Automation 服务器程序源代码如下:

// EDITSERVERIMPL : Implementation of TEditServerImpl (CoClass: EditServer, Interface: IEditServer)

#include <vcl.h>
#pragma hdrstop

#include "EDITSERVERIMPL.H"
#include "Unit1.h"
/////////////////////////////////////////////////////////////////////////////
// TEditServerImpl

STDMETHODIMP TEditServerImpl::Clear()
{
try
{
Form1->Edit1->Text="";
}
catch(Exception &e)
{
return Error(e.Message.c_str(),IID_IEditServer);
}
return S_OK;
}

STDMETHODIMP TEditServerImpl::get_EditNum(int* Value)
{
try
{
int val = atoi(Form1->Edit1->Text.c_str());
*Value = val;
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IEditServer);
}
return S_OK;
};


STDMETHODIMP TEditServerImpl::get_EditStr(BSTR* Value)
{
try
{
*Value = WideString(Form1->Edit1->Text).Detach();
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IEditServer);
}
return S_OK;
};


STDMETHODIMP TEditServerImpl::set_EditNum(int Value)
{
try
{
Form1->Edit1->Text = AnsiString(Value);
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IEditServer);
}
return S_OK;
};


STDMETHODIMP TEditServerImpl::set_EditStr(BSTR Value)
{
try
{
Form1->Edit1->Text = AnsiString(Value);
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IEditServer);
}
return S_OK;
};


STDMETHODIMP TEditServerImpl::SetThreeStr(BSTR s1, BSTR s2, BSTR s3,
BSTR* result)
{
try
{
WideString retval(s1);
retval += L" ";
retval += s2;
retval += L" ";
retval += s3;
Form1->Edit1->Text = retval;

// Send out a copy of our concatenated BSTR
// NOTE: result is not an [in, out], so we're not responsible for freeing what was there before
*result = retval.Copy();
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IEditServer);
}
return S_OK;
}



//---------------------------------------------------------------------

客户程序如下:(客户程序要调用刚才创建的Automaiton服务器)

//------------------------------------------------------------------------//-头文件 Unit1.h

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "Server_TLB.h"
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
TEdit *Edit1;
TButton *Button2;
TButton *Button3;
TButton *Button4;
TLabel *Label1;
TLabel *Label2;
TButton *Button5;
TButton *Button6;
TButton *Button7;
TButton *Button8;
TLabel *Label3;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
void __fastcall Button3Click(TObject *Sender);
void __fastcall Button4Click(TObject *Sender);
void __fastcall Button5Click(TObject *Sender);
void __fastcall Button6Click(TObject *Sender);
void __fastcall Button7Click(TObject *Sender);
void __fastcall Button8Click(TObject *Sender);
private: // User declarations
IEditServerDisp AutoServer;
TCOMIEditServer EditServer;
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//------------------------------------------------------------------------
//Unit1.cpp
#endif

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"



//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
try
{
AutoServer.BindDefault();
EditServer = CoEditServer::Create();//创建COM实例
}
catch (...)
{
ShowMessage("Please build and run the \\AutoSrv\\autosrv example before this one.");
Application->Terminate();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AutoServer.EditStr = WideString(Edit1->Text);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Edit1->Text = AutoServer.EditStr;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
// Call a server function
AutoServer.Clear();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
WideString retval;

AutoServer.SetThreeStr(WideString("one"),WideString("two"),
WideString("three"), &retval);
Edit1->Text = retval;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
//call the server's setter function
EditServer->set_EditStr(WideString(Edit1->Text));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button6Click(TObject *Sender)
{
WideString str;
EditServer->get_EditStr(&str);
Edit1->Text = AnsiString(str);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button7Click(TObject *Sender)
{
// Call a server function
EditServer->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button8Click(TObject *Sender)
{
WideString p1("This ");
WideString p2("is a ");
WideString p3("test.");
WideString retval;

// The [out, retval] parameter most come last.
EditServer->SetThreeStr(p1, p2, p3, &retval);
Edit1->Text = retval;
}
//------------------


现在请教高手几个问题:
在服务器:
STDMETHODIMP TEditServerImpl::Clear()中,STDMETHODIMP是什么意思?返回的什么完意?

return S_OK; S_OK是什么东西?

数据类型 BSTR, WideString ,AnsiString 有什么不同?

在客户:

AutoServer.BindDefault();
EditServer = CoEditServer::Create();//创建COM实例(对象)

而在Uni1.h中,IEditServerDisp AutoServer;
TCOMIEditServer EditServer;

EditServer对象不是由CoEditServer:;Create()创造了吗?为什么还要由TCOMIEditServer再创造?
TCOMIEditServerS是什么东西?

IEditServerDisp 是双接口中的一个?






...全文
107 3 打赏 收藏 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
fantong 2002-06-10
  • 打赏
  • 举报
回复
我眼花,晕了
STDMETHODIMP =
#define STDMETHODIMP HRESULT STDMETHODCALLTYPE
S_OK
#define S_OK ((HRESULT)0x00000000L)
bjhua 2002-06-08
  • 打赏
  • 举报
回复
现在请教高手几个问题:
***在服务器:
STDMETHODIMP TEditServerImpl::Clear()中,STDMETHODIMP是什么意思?返回的什么完意?
stdmethodimp = _stdcall
return S_OK; S_OK是什么东西?
S_OK是一个long,表示成功
***数据类型 BSTR, WideString ,AnsiString 有什么不同?
BSTR是包含长度前缀、以NULL结尾的OLECHAR.OLECHAR 在windows中是用typedef 定义的wchar_t,WideString就是双子节字符的字符串了,AnsiString是C++Builder里定义的字符串。好像与WideString差不多。

****
在客户:
AutoServer.BindDefault();
EditServer = CoEditServer::Create();//创建COM实例(对象)

而在Uni1.h中,IEditServerDisp AutoServer;
TCOMIEditServer EditServer;

EditServer对象不是由CoEditServer:;Create()创造了吗?为什么还要由TCOMIEditServer再创造?
TCOMIEditServerS是什么东西?

你查一下 TCOMIEditServer是不是一个智能指针,或者别的什么类似于指针的东西。


IEditServerDisp 是双接口中的一个?
quaker1234 2002-06-08
  • 打赏
  • 举报
回复
STDMETHODIMP、 S_OK这些都是宏定义,查一下相应的.h文件应该能找到,我用vc,声明接口时有STDMETHOD的宏定义,比如STDMETHOD(methodname)就是声明接口成员函数methodname(),此成员函数返回HRESULT。
S_OK也是宏定义相当于SUCCESS,成功标志
下面问题请高手回答
源码直接下载地址: https://pan.quark.cn/s/b2e30c4b4277 依据所提供的文件资料,可以总结出以下核心内容: 1. 华硕玩家国度x79 R4G主板属于高端级别的主板,归类于华硕玩家国度系列中的RAMPAGE IV GENE型号。该主板主要面向高端用户及游戏爱好者,具有卓越性能的特点。 2. 华硕玩家国度x79 R4G主板的使用指南采用简体中文版本,并以PDF格式发布。用户手册全面地阐述了该主板的操作方法和各项功能。 3. 版权声明明确指出,本手册包含的所有内容均受到著作权法的保护。未经华硕电脑股份有限公司(简称“华硕”)的许可,禁止进行任何形式的复制、剽窃、翻译或分发。 4. 免责声明具体说明,华硕提供的用户手册依照其发布时的状态呈现,不提供任何明示或暗示的保证。用户使用手册所面临的风险需自行承担,且华硕不对使用手册后的任何结果或信息的精确性或可靠性提供保证。 5. 用户手册中强调,使用本手册后可能引发的风险和损失,涵盖但不限于利益损失、业务中断、数据遗失或其他经济上的损失,华硕及其授权人员、雇员等均不承担相应责任。 6. 华硕拥有随时更新用户手册的权力。当产品规格或驱动程序发生变化时,用户手册将进行相应的修订。用户可以通过华硕的客户服务网站或直接联络华硕电脑客户关怀中心以获取最新版本的信息。 7. 第三方产品名称或内容的所有权和知识产权归属于各自的所有者,并受到相关法律法规的保护。 8. 在华硕的保修政策中,若产品经历过未经华硕授权的维修、规格调整、部件更换或其他未授权操作,或者产品序列号模糊不清或遗失,产品将不再享受华硕的保修和服务。 9. 华硕供应的主板及显卡产品在中国大陆地区(不包括港澳台地区)实施三年免费保修服务及全国联保服务...
内容概要:本文围绕2026年高教社杯全国大学生数学建模竞赛B题“无线电干扰源的快速自动定位与清除”提供了一套完整的数学建模、算法实现与论文撰写的免费资源。该资源由“荔枝科研社”出品,依托一个涵盖智能优化算法、机器学习、深度学习、信号处理、通信技术、电力系统管理等多个前沿领域的综合性科研资源共享平台。文档以MATLAB和Python为主要工具,聚焦于复杂工程问题的建模与求解,尤其在干扰源定位、状态估计、路径规划及优化调度等方面具有突出的应用价值。资源不仅包含竞赛题目解析,还提供了大量可复现的代码实例与技术文档,旨在帮助用户深入理解算法原理并提升科研实践能力。; 适合人群:具备一定编程基础,特别是熟练掌握MATLAB或Python语言的本科生、研究生,正在备战数学建模竞赛的学生,以及从事通信、信号处理、电力系统等相关领域研究的科研人员和技术开发者。; 使用场景及目标:①为参赛学生提供B题的完整解题思路、模型构建方法与代码实现路径,加速竞赛准备进程;②为科研工作者提供高质量、可复现的算法代码与技术参考,推动智能算法在无线通信、应急响应、环境监测等实际场景中的应用研究;③促进跨学科技术融合,支持教学、科研与工程实践的协同发展。; 阅读建议:建议读者结合文中提供的网盘链接与《荔枝科研社资源整理目录》系统性地查阅资料,优先选择与自身研究方向契合的技术模块进行深入学习,并动手运行代码以验证算法效果。同时推荐关注微信公众号“荔枝科研社”以获取持续更新的技术内容与社群支持。

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧