I've tried that, but it's msado15.h, not msado15_h.h, and it isn't the same.
I get a load of errors that I've got better things to do than fix, I'd
rather have a .vbs that modifies the midl output to be correct as it doesn't
seem like there's any other viable solution.
> I've tried that, but it's msado15.h, not msado15_h.h, and it isn't the
> same. I get a load of errors that I've got better things to do than fix,
> I'd rather have a .vbs that modifies the midl output to be correct as it
> doesn't seem like there's any other viable solution.
As I mentioned in another post, I prefer the #import directive, but some
playing around got the following to work. I used some of the COM support
classes because I *hate* dealing directly with BSTR and VARIANT. I didn't
really do all that much testing, but the following (with an appropriate
connection string and query string) retrieved and printed the first column
of the first row in the recordset...
/*
test.cpp, compiles with MSVC.NET...
cl /GX test.cpp /link ole32.lib comsupp.lib
*/
#include <windows.h>
#include <initguid.h>
#include "adoid.h"
#include "msado15.h"
#include <comdef.h>
#include <comutil.h>
#include <string>
#include <iostream>
using namespace std;
struct COM_Init {
COM_Init() { CoInitialize(NULL); }
~COM_Init() { CoUninitialize(); }
} COM_Init_;
static void check_hr(HRESULT hr) {
if (FAILED(hr)) throw hr;
}
template <class T> static void safe_rel(T& t) {
if (!t) return;
t->Release();
t = NULL;
}
void safe_rel_rs(ADORecordset*& rs) {
if (!rs) return;
long s = 0;
if (SUCCEEDED(rs->get_State(&s)))
if (adStateOpen == s)
rs->Close();
safe_rel(rs);
}
static string bstr2stl(const _bstr_t& b) {
const char* c = b.operator const char *();
return c ? c : "";
}
int main(void)
{
ADORecordset* rs = NULL;
ADOFields* flds = NULL;
ADOField* f = NULL;
try {
HRESULT hr = S_OK;
hr = CoCreateInstance(CLSID_CADORecordset, NULL,
CLSCTX_INPROC_SERVER, IID_IADORecordset, (void**)&rs);
check_hr(hr);
_variant_t connect = _bstr_t("Your_Connection_String");
_variant_t source = _bstr_t("Your_SQL_SELECT");
hr = rs->Open(source, connect, adOpenForwardOnly,
adLockReadOnly, -1);
check_hr(hr);
check_hr(rs->get_Fields(&flds));
_variant_t val;
check_hr(flds->get_Item(_variant_t(0L), &f));
check_hr(f->get_Value(&val));
cout << bstr2stl((_bstr_t)val) << endl;
}
catch(HRESULT hr) { cerr << "COM Failure: " << hr << endl; }
catch(...) { cerr << "exception" << endl; }
safe_rel(f);
safe_rel(flds);
safe_rel_rs(rs);
return 0;
}
Bonj - 16 Dec 2004 12:39 GMT
That'd be great, I wouldn't have a problem if I could use the COM support
classes - which aren't included as part of the SDK.
>> I've tried that, but it's msado15.h, not msado15_h.h, and it isn't the
>> same. I get a load of errors that I've got better things to do than fix,
[quoted text clipped - 91 lines]
> return 0;
> }
Craig Kelly - 16 Dec 2004 21:56 GMT
> That'd be great, I wouldn't have a problem if I could
> use the COM support classes - which aren't included as
> part of the SDK.
Doh! I thought they were part of the SDK.
But regardless, the code is straight COM plus the ado headers, _bstr_t,
_variant_t, and _com_error. All you'd have to do is use the traditional
functions like VariantInit, SysAllocString, et al instead of the helper
classes I used.
Craig
Bonj - 17 Dec 2004 02:02 GMT
Yes, it is you're right, so I might take some of those things into my
project actually, I like the template safe_rel and the check_hr ideas.
Thanks
>> That'd be great, I wouldn't have a problem if I could
>> use the COM support classes - which aren't included as
[quoted text clipped - 8 lines]
>
> Craig