Не уверен, что это все еще необходимо, но вот как я решил проблему. Если вы посмотрите на примеры кода, между моим фрагментом кода и кодом Madhu ничего не изменилось.
Хитрость была в том, как передать строку "TR". Я не мог понять, почему это имеет значение, но это так. Возможно, кто-то еще может пролить свет на то, почему.
Это не сработало:
BSTR eTag = SysAllocString(L"TR");
hr = pDoc2->createElement(eTag,&pTRElmt);
Это сделал:
hr = pDoc2->createElement(L"TR",&pTRElmt);
Вот фрагмент кода, который работал для меня:
// create table node
IHTMLElement *pTableElmt = NULL;
hr = pDoc2->createElement(L"TABLE",&pTableElmt);
if(FAILED(hr))
return hr;
IHTMLDOMNode *pTableNode = NULL;
hr = pTableElmt->QueryInterface(IID_IHTMLDOMNode, (void **)&pTableNode);
if(FAILED(hr))
return hr;
// create TR node
BSTR eTag = SysAllocString(L"TR");
IHTMLElement *pTRElmt = NULL;
hr = pDoc2->createElement(L"TR",&pTRElmt);
if(FAILED(hr))
return hr;
IHTMLDOMNode *pTRNode = NULL;
hr = pTRElmt->QueryInterface(IID_IHTMLDOMNode, (void **)&pTRNode);
if(FAILED(hr))
return hr;
IHTMLDOMNode *pRefNode = NULL;
hr = pTableNode->appendChild(pTRNode,&pRefNode);
if(FAILED(hr))
return hr;
// create TD node
IHTMLElement *pTDElmt = NULL;
hr = pDoc2->createElement(L"TD",&pTDElmt);
if(FAILED(hr))
return hr;
IHTMLDOMNode *pTDNode = NULL;
hr = pTDElmt->QueryInterface(IID_IHTMLDOMNode,(void **)&pTDNode);
if(FAILED(hr))
return hr;
hr = pTRNode->appendChild(pTDNode,&pRefNode);
if(FAILED(hr))
return hr;
// create TEXT Node
IHTMLDOMNode *pTextNode = NULL;
hr = pDoc3->createTextNode(L"madhu", &pTextNode);
if(FAILED(hr))
return hr;
hr = pTDNode->appendChild(pTextNode,&pRefNode);
if(FAILED(hr))
return hr;
//add to body
CComQIPtr<IHTMLElement> pBody;
CComQIPtr<IHTMLDOMNode> pBodyNode;
pDoc2->get_body( &pBody );
pBody->QueryInterface(IID_IHTMLDOMNode, (void**)&pBodyNode);
HRESULT hr = pBodyNode->appendChild( pTableNode, &pRefNode);