This macro can be used to validate input arguments in COM.
#include <Windows.h>
#define A_OUT(pp) if (pp) {*pp = 0; } else { hr = E_POINTER; }
#define A_IN(p) if (!p) { hr = E_POINTER;}
#define A_OPTIONAL(p)
#define REQUIRE(...) \
while(1)\
{\
HRESULT hr = 0; \
__VA_ARGS__ \
if (FAILED(hr)) \
return hr; \
break;\
}
HRESULT F(const char* p, char** pp)
{
REQUIRE(A_IN(p) A_OUT(pp))
return S_OK;
}
int main(int argc, char* argv[])
{
char* p ;
HRESULT hr = F("s", &p);
hr = F(0, &p);
hr = F("s", 0);
hr = F(0, 0);
return 0;
}