描述:
我重建了一个 MFC Regular DLL with Automation 的项目,使用 classwizard 新建一个 class 的时候,发现不能把返回值定义为自己想要的类型。请教各位大侠!
我期望的 class 为
class MyLogger{
public:
static MyLogger& getLogger(LPCTSTR value);
void log(LPCTSTR value);
}
请教怎么写 getLogger 的返回值? 另外,如果返回对象指针,怎么销毁?
解决方案1:
mm
解决方案2:mark
解决方案3:BYTE** pbClass
解决方案4:http://blog.csdn.net/newkey007/archive/2004/07/09/38139.aspx
解决方案5:这样运行性能比较低一些。
解决方案6: VB的那些对象不是变体就是自动化的。在VC中的对应类型是VARIANNT/IDispatch*
VB是快速开发的一个很好的工具。它自动替你实现了组件创建、接口查询、引用计数和组件的生命期问题。通常你要做的只是实现接口。同时如果你添加了一个到组件类型库的引用,那么你可以在自动完成功能中看到它会自动提示接口的成员。VB的优点在于快速开发,缺点是降低了灵活度,以及混淆了接口及其实现。区分接口及其实现是COM的核心之一。
4.对于想把一个ASP对象作为参数的方法(如Request对象),可以使用[in]Iunkown *pIUnk
,在函
数体内,可用如下语句:(具体请查阅MSDN中的相关类的内容)
IRequest* pIRequest;
HRESULT hr = pIUnk->QueryInterface(IID_IRequest, reinterpret_cast<LPVOID*>(&pIRe
quest));
Long m_lDataSize;
HRESULT hr = pIRequest->get_TotalBytes(&m_lDataSize);
if (FAILED(hr))
return hr;
if (m_lDataSize == 0L)
{
return S_OK;
}
COleVariant varBytesToRead;
COleSafeArray sarrayBytes;
varBytesToRead = m_lDataSize;
sarrayBytes.CreateOneDim(VT_UI1, m_lDataSize);
hr = pIRequest->BinaryRead(&varBytesToRead, &sarrayBytes);
if (FAILED(hr))
{
sarrayBytes.Clear();
return hr;
}
…
5.对于不定个数参数,可使用SAFEARRAY,但使用方法较为复杂。可以在参数中输入如下的内
容[in]SAFEARRAY array,并按Attribute…按钮,在Name中选择vararg。按确定后修改idl文
件在把[in]SAFEARRAY array改为[in]SAFEARRAY(VARIANT) array。然后再打开MyComponent.
h文件把该函数的参数SAFEARRAY array改为SAFEARRAY* array。再打开MyComponent.cpp文件
修改参数,在函数体内
使用COleSafeArray类实现该参数的控制,如“COleSafeArray SArray(array,VT_BSTR)”,
具体操作可查阅MSDN中的该类的成员函数。
1.对于传入的参数必须在参数前加上[in],然后可跟上如int n或float f等。且每个传入参
数前都必
须写明。
2.对于调用方法的返回,不再是该方法名前的类型(因为所有这些方法都返回HRESULT,即表
明是否调用成功),所以使用传出的参数,在参数前必须加上[out,retval],然后可跟上如in
t* n 或者float* f等(如果返回的是int 或float 类型值时)。且每个方法仅限于返回一个
这样的参数。在函数体中可如写上如“*Number2=Number1;”,表示把输入参数作为传出参数
。
3.对于最常用的字符串参数在此我们使用BSTR str而不是通常的char* 或CString,所以在参
数中需
要写作[in]BSTR str 或[out,retval]BSTR* str。需要特别注意与CString的转换。如新建一
个函
数StrConv([in]BSTR bstr1,[out,retval]BSTR* bstr2),在函数体中可写上如:
CString str;
str=bstr1;
str=str.Left(str.GetLength()-1);
*bstr2=str.AllocSysString();
这种问题已经问过很多次了,只能在接口中方法中返回接口指针,eg:
HRESULT GetIXXX([out,retval]IDISATCH** PIXXX);
你要返回类对象指针那时不可能的!哈哈!