1、关于控件接口/api接口的设计
如果主程序需要向控件中传递一些内容,这些内容需要在控件内部被包装成其他的内部处理的结构体或类,则建议在设计控件接口时,将接口需要的参数设计成通用的数据类型,而不是在主程序中使用控件内部需要的结构体形式进行控制,例如下面的例子:
//控件程序
typedef struct _AStruct{ //控件内部需要的结构体
DWORD A;
DWORD B;
} AStruct;
DWORD _stdcall _declspec(dllexport) Add(_AStruct& Struct)
{
return Struct.A + Struct.B;
}
//主程序
/* 获取控件中的相关函数的接口,这里省略,下面使用Add时表示已经获取到了*/
void SomeFunction()
{
AStruct struct;
struct.A = 0x00000001;
struct.B = 0x00000002;
print("相加后的数据值为:%d",Add(struct));
}
我认为上面的这种操作方法不合适,因为如果在控件中的Struct结构体更改后,需要将主程序中的Struct声明加载,重新编译一下,这个就达不到低耦合的要求了,所以建议将其更改为如下两种方式:
//还是在控件中的结构体声明
typedef struct _AStruct{ //控件内部需要的结构体
DWORD A;
DWORD B;
} AStruct;
方法1)
DWORD _stdcall _declspec(dllexport) Add(DWORD& dword1, DWORD& dword2)
{
AStruct struct;
struct.A = dword1;
struct.B = dword2;
return Struct.A + Struct.B;
}
//主程序
/* 获取控件中的相关函数的接口,这里省略,下面使用Add时表示已经获取到了*/
void SomeFunction()
{
DWORD A = 0x00000001;
DWORD B = 0x00000002;
print("相加后的数据值为:%d",Add(A,B));
}
方法2)
DWORD _stdcall _declspec(dllexport) Add(_AStruct& Struct)
{
return Struct.A + Struct.B;
}
DWORD _stdcall _declspec(dllexport) AddEx(DWORD& dword1, DWORD& dword2)
{
AStruct struct;
struct.A = dword1;
struct.B = dword2;
return Add(struct);
}
//主程序
/* 获取控件中的相关函数的接口,这里省略,下面使用Add时表示已经获取到了*/
void SomeFunction()
{
DWORD A = 0x00000001;
DWORD B = 0x00000002;
print("相加后的数据值为:%d",Add(A,B));
}
2、关于程序的设计
我们公司提供的产品比较贴近底层,即可硬件打交道比较多,全国做我们这行的也不止我们一家;近期的项目基本都是这种类型的,即上层应用由客户提供,然后客户提供一个接口标准,我们厂家按照这个接口标准来实现;理想情况下,我们底层是必须根据客户提供的接口标准来实现功能,但是确实存在有的设备不支持某些功能...
不想写下去了,直接说我的想法吧:
上层在制定标准及接口时,应该多听听厂家的意见,看厂家的设备能支持那些功能,不能支持那些功能,虽说厂家必须要遵守上层应用的接口标准,但这个标准必须是合理的,而不能试由上层的某些相关负责人随意臆想后制定的;如果一个上层应用不能把用到的设备都进行了支持(或对大部分设备进行支持),则只能说明你这个应用是失败的!