参数个数可变、而且类型不固定,这样的函数怎么调用?

flamkuavos 2011-01-05 10:50:54
有一个微软提供的函数:
InvokeHelper(DWORD dwDisp, BYTE *pbParamInfo, ...);
// pbParamInfo是省略号所表示的变参的类型信息的字符数组指针,
// 后面的变参(省略号),数目(最多需要12个)和类型都不确定,可以是
// short、double和CString(LPCTSTR)。如果仅仅是数值,那就好办
// 了,关键是有字符串。我试过把这3种类型都转成char*,但传进去总
// 是有问题





变参的数目、类型和具体的值我都可以知道,当然,都是动态的从一个列表中取出来的,现在我要把这些个数、类型都不固定的变量传进InvokeHelper这个函数,就是在省略号的地方。

都强制转换成char*类型才能在代码中用12行调用InvokeHelper的语句来写,但都不对,传进去的short型可能变成负数,字符串也可能是乱码。所以,似乎只有原汁原味的类型传进去才对。
这个代码,我想不出来可以怎么写了,请帮我看看,谢谢!
...全文
307 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ryfdizuo 2011-01-06
  • 打赏
  • 举报
回复
InvokeHelper的用法:

void CMSComm::SetCDHolding(BOOL bNewValue)
{
static BYTE parms[] =
VTS_BOOL;
InvokeHelper(0x1, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
bNewValue);
}

BOOL CMSComm::GetCDHolding()
{
BOOL result;
InvokeHelper(0x1, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}

void CMSComm::SetCommID(long nNewValue)
{
static BYTE parms[] =
VTS_I4;
InvokeHelper(0x3, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
nNewValue);
}

long CMSComm::GetCommID()
{
long result;
InvokeHelper(0x3, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
return result;
}

void CMSComm::SetCommPort(short nNewValue)
{
static BYTE parms[] =
VTS_I2;
InvokeHelper(0x4, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
nNewValue);
}

short CMSComm::GetCommPort()
{
short result;
InvokeHelper(0x4, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, NULL);
return result;
}

void CMSComm::SetCTSHolding(BOOL bNewValue)
{
static BYTE parms[] =
VTS_BOOL;
InvokeHelper(0x5, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
bNewValue);
}

BOOL CMSComm::GetCTSHolding()
{
BOOL result;
InvokeHelper(0x5, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}

void CMSComm::SetDSRHolding(BOOL bNewValue)
{
static BYTE parms[] =
VTS_BOOL;
InvokeHelper(0x7, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
bNewValue);
}

BOOL CMSComm::GetDSRHolding()
{
BOOL result;
InvokeHelper(0x7, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}

void CMSComm::SetDTREnable(BOOL bNewValue)
{
static BYTE parms[] =
VTS_BOOL;
InvokeHelper(0x9, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
bNewValue);
}

BOOL CMSComm::GetDTREnable()
{
BOOL result;
InvokeHelper(0x9, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}

void CMSComm::SetHandshaking(long nNewValue)
{
static BYTE parms[] =
VTS_I4;
InvokeHelper(0xa, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
nNewValue);
}

long CMSComm::GetHandshaking()
{
long result;
InvokeHelper(0xa, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
return result;
}

void CMSComm::SetInBufferSize(short nNewValue)
{
static BYTE parms[] =
VTS_I2;
InvokeHelper(0xb, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
nNewValue);
}

short CMSComm::GetInBufferSize()
{
short result;
InvokeHelper(0xb, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, NULL);
return result;
}

void CMSComm::SetInBufferCount(short nNewValue)
{
static BYTE parms[] =
VTS_I2;
InvokeHelper(0xc, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
nNewValue);
}

short CMSComm::GetInBufferCount()
{
short result;
InvokeHelper(0xc, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, NULL);
return result;
}

void CMSComm::SetBreak(BOOL bNewValue)
{
static BYTE parms[] =
VTS_BOOL;
InvokeHelper(0xd, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
bNewValue);
}

BOOL CMSComm::GetBreak()
{
BOOL result;
InvokeHelper(0xd, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}

void CMSComm::SetInputLen(short nNewValue)
{
static BYTE parms[] =
VTS_I2;
InvokeHelper(0xe, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
nNewValue);
}

short CMSComm::GetInputLen()
{
short result;
InvokeHelper(0xe, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, NULL);
return result;
}

void CMSComm::SetNullDiscard(BOOL bNewValue)
{
static BYTE parms[] =
VTS_BOOL;
InvokeHelper(0x10, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
bNewValue);
}

BOOL CMSComm::GetNullDiscard()
{
BOOL result;
InvokeHelper(0x10, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}

void CMSComm::SetOutBufferSize(short nNewValue)
{
static BYTE parms[] =
VTS_I2;
InvokeHelper(0x11, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
nNewValue);
}

short CMSComm::GetOutBufferSize()
{
short result;
InvokeHelper(0x11, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, NULL);
return result;
}

void CMSComm::SetOutBufferCount(short nNewValue)
{
static BYTE parms[] =
VTS_I2;
InvokeHelper(0x12, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
nNewValue);
}

short CMSComm::GetOutBufferCount()
{
short result;
InvokeHelper(0x12, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, NULL);
return result;
}

void CMSComm::SetParityReplace(LPCTSTR lpszNewValue)
{
static BYTE parms[] =
VTS_BSTR;
InvokeHelper(0x13, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
lpszNewValue);
}

CString CMSComm::GetParityReplace()
{
CString result;
InvokeHelper(0x13, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
return result;
}

void CMSComm::SetPortOpen(BOOL bNewValue)
{
static BYTE parms[] =
VTS_BOOL;
InvokeHelper(0x14, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
bNewValue);
}

BOOL CMSComm::GetPortOpen()
{
BOOL result;
InvokeHelper(0x14, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}

void CMSComm::SetRThreshold(short nNewValue)
{
static BYTE parms[] =
VTS_I2;
InvokeHelper(0x15, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
nNewValue);
}

short CMSComm::GetRThreshold()
{
short result;
InvokeHelper(0x15, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, NULL);
return result;
}

void CMSComm::SetRTSEnable(BOOL bNewValue)
{
static BYTE parms[] =
VTS_BOOL;
InvokeHelper(0x16, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
bNewValue);
}

BOOL CMSComm::GetRTSEnable()
{
BOOL result;
InvokeHelper(0x16, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}

void CMSComm::SetSettings(LPCTSTR lpszNewValue)
{
static BYTE parms[] =
VTS_BSTR;
InvokeHelper(0x17, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
lpszNewValue);
}

CString CMSComm::GetSettings()
{
CString result;
InvokeHelper(0x17, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
return result;
}

void CMSComm::SetSThreshold(short nNewValue)
{
static BYTE parms[] =
VTS_I2;
InvokeHelper(0x18, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
nNewValue);
}

short CMSComm::GetSThreshold()
{
short result;
InvokeHelper(0x18, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, NULL);
return result;
}

void CMSComm::SetOutput(const VARIANT& newValue)
{
static BYTE parms[] =
VTS_VARIANT;
InvokeHelper(0x19, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
&newValue);
}

VARIANT CMSComm::GetOutput()
{
VARIANT result;
InvokeHelper(0x19, DISPATCH_PROPERTYGET, VT_VARIANT, (void*)&result, NULL);
return result;
}

void CMSComm::SetInput(const VARIANT& newValue)
{
static BYTE parms[] =
VTS_VARIANT;
InvokeHelper(0x1a, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
&newValue);
}

VARIANT CMSComm::GetInput()
{
VARIANT result;
InvokeHelper(0x1a, DISPATCH_PROPERTYGET, VT_VARIANT, (void*)&result, NULL);
return result;
}

void CMSComm::SetCommEvent(short nNewValue)
{
static BYTE parms[] =
VTS_I2;
InvokeHelper(0x1b, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
nNewValue);
}

short CMSComm::GetCommEvent()
{
short result;
InvokeHelper(0x1b, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, NULL);
return result;
}

void CMSComm::SetEOFEnable(BOOL bNewValue)
{
static BYTE parms[] =
VTS_BOOL;
InvokeHelper(0x1c, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
bNewValue);
}

BOOL CMSComm::GetEOFEnable()
{
BOOL result;
InvokeHelper(0x1c, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}

void CMSComm::SetInputMode(long nNewValue)
{
static BYTE parms[] =
VTS_I4;
InvokeHelper(0x1d, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
nNewValue);
}

long CMSComm::GetInputMode()
{
long result;
InvokeHelper(0x1d, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
return result;
}
flamkuavos 2011-01-06
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20110106/09/f6781818-bfba-4e1c-82cd-79e64050fc42.html
是ls的正确回答,所以给分
  • 打赏
  • 举报
回复
flamkuavos 2011-01-05
  • 打赏
  • 举报
回复
l楼的兔子部长,你的解答很好,谢谢你,我看了,但是还不一定是我要的答案

你介绍的文章,看明白可以知道怎么写变参函数,以及它的取参方法,但我现在的难题发生在调用上,而且面对字符串参数时,这个变参的指针怎么移动的,还是个问题,我还得研究研究。不过你的文章很有帮助啦,基础嘛。
jyh_baoding 2011-01-05
  • 打赏
  • 举报
回复
可变参数的处理
oyljerry 2011-01-05
  • 打赏
  • 举报
回复
需要指定对应的类型告诉函数.
oyljerry 2011-01-05
  • 打赏
  • 举报
回复
void InvokeHelper( DISPID dwDispID, WORD wFlags, VARTYPE vtRet, void* pvRet, const BYTE* pbParamInfo, ... );
  说明:
  Call this member function to invoke the OLE control method or property specified by dwDispID, in the context specified by wFlags.
  其中参数:
  dwDispID:
  //Identifies the method or property to be invoked. This value is usually supplied by Component Gallery.
  wFlags:可以为下面些值,指明调用InvokeHelper的目的。
  //[ DISPATCH_METHOD ] The member is invoked as a method. If a property has the same name, both this and the DISPATCH_PROPERTYGET flag may be set.
  [ DISPATCH_PROPERTYGET ] The member is retrieved as a property or data member.
  [ DISPATCH_PROPERTYPUT ] The member is changed as a property or data member.
  [ DISPATCH_PROPERTYPUTREF ] The member is changed by a reference assignment, rather than a value assignment. This flag is valid only when the property accepts a reference to an object.
  vtRet:
  //Specifies the type of the return value.
  VT_EMPTY void
  VT_I2 short
  VT_I4 long
  VT_R4 float
  VT_R8 double
  VT_CY CY
  VT_DATE DATE
  VT_BSTR BSTR
  VT_DISPATCH LPDISPATCH
  VT_ERROR SCODE
  VT_BOOL BOOL
  VT_VARIANT VARIANT
  VT_UNKNOWN LPUNKNOWN
  pvRet:
  //Address of the variable that will that will receive the property value or return value. It must match the type specified by vtRet.
  pbParamInfo:一般都设置为NULL
  //Pointer to a null-terminated string of bytes specifying the types of the parameters following pbParamInfo.
  specifies the types of the parameters passed to the method or property.
  ...:
  //Variable List of parameters, of types specified in pbParamInfo.
Eleven 2011-01-05
  • 打赏
  • 举报
回复

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

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