Я не понял главного. Ты создаешь arx-файл или exe-файл? Если arx-файл, то зачем изврашаться и обращаться к чертежу через "одно место" (именуемое ActiveX), если для этого в ObjectARX есть специальные методы?
А по поводу твоего кода - проверять не стал, но первое, что бросилось в глаза - ты объявил double p[2], а записываешь в p[2], т.е. явно за границу. К тому же AddMtext требует не double [3], а Variant, который получается при помощи следующей функции:
HRESULT getVariantFromPoint(const double pt[3], VARIANT* pVal)
{
pVal->vt = VT_ARRAY | VT_R8;
SAFEARRAYBOUND rgsaBound;
rgsaBound.lLbound = 0L;
rgsaBound.cElements = 3;
pVal->parray = SafeArrayCreate(VT_R8, 1, &rgsaBound);
if (! pVal->parray) return E_OUTOFMEMORY;
HRESULT hr;
for (long i = 0; i < 3; i++) {
if ((hr = SafeArrayPutElement(pVal->parray,&i,(void*)&pt[i]))!=S_OK) return hr;
}
return S_OK;
}
И твой код превращается приблизительно в это:
...
double p[3];
p[0]=20; p[1]=30; p[2]=50;
VARIANT vp; VariantInit(&vp);
_com_util::CheckError(getVariantFromPoint(p,&vp));
_com_util::CheckError(pModelSpace->AddMText(vp,2,_bstr_t("Hello world")));