[x]
Posted via EE Mobile

Search, ask, and monitor your questions on the go with EE Mobile. Visit Experts Exchange from your mobile device and never be out of touch again.

09/19/2009 at 09:01AM PDT, ID: 24745660
[x]
Attachment Details
[x]
The Solution Rating System

With so many solutions, how can you tell which solutions are most likely to help you and which ones are not? To provide you with a tool to use, we rate our solutions based on various elements that most accurately determine if a solution is a quality solution. To explain what factors affect the solution rating, here are the elements we take into consideration when formulating our solution rating.

  • The Grade of the Solution
  • The Zone Rank of the Expert Providing the Solution
  • The Number of Author and Expert Comments
  • The Number of Experts Contributing
  • The Feedback of the Community

Your Input Matters
Because of the way the system is set up, the most important variable in this equation is you. As a member of Experts Exchange, you are able to cast your vote on the quality of the solutions in regard to how complete, accurate, helpful and easy to understand each solution is. When you provide your feedback, each rating is adjusted accordingly. So, if you see a solution that has a poor rating that you think is a good solution, let us know by rating it. As you do, the rating will be adjusted and will become more accurate for other members of our site.

If you have any suggestions that you would like to make for our rating system, please ask a question in the Suggestions Zone of Community Support.

Thank you!

8.3

Binary ADO Stream::Write always fails with 0x800A0BB9 (invalid arguments). (VC++)

Asked by JasonCipriani in Databases Miscellaneous, Microsoft Visual C++, Microsoft Development

Tags: ado stream write safearray variant 0x800A0BB9

I have an ADO Stream, opened in binary mode, and I want to write binary data to that stream. Below is a test program that compiles as a console application in VC++ 2008. It simply creates a new stream, opens it in binary mode, and attempts to write some data. Write() fails with error 0x800A0BB9 (invalid argument). I have no idea why.

If I open the stream in text mode and use WriteText, it works with no problem. If I open the stream in binary mode and use WriteText, it fails as expected (illegal operation). But, no matter what mode I open the stream in, when I use Write, it fails.

I have tried other VARIANT types besides the one in the code snippet below (arrays, other simple types), all with the same results. (In my actual program, I'm attempting to write an array of bytes as a SAFEARRAY wrapped in a VARIANT).

I've also tried setting the stream mode before opening it, with no effect. I have verified that the stream is open in binary mode by getting it's type and checking that it is adTypeBinary.

What am I doing wrong here? Why is Write failing every time? How do I write binary data to an ADO Stream?

In case you are wondering, the reason I am doing this is because I'm using CDOSYS to send emails with attachments, and I'm constructing attachments from blocks of arbitrary binary data in memory. The Stream in question is the decoded content stream from an IBodyPart. However, it seems to have nothing to do with CDOSYS, as I'm having the same problem in the test case below.

Thanks!

(Edit: Question rewritten -- it's pretty much the same as my first comment below now)
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace raw_interfaces_only
#include <cstdio>
#include <stdexcept>
#include <string>
 
using namespace std;
 
 
struct auto_coinit {
    auto_coinit () { CoInitializeEx(NULL, COINIT_MULTITHREADED); }
    ~auto_coinit () { CoUninitialize(); }
};
 
 
struct error_code : public runtime_error {
    static string estr (const char *w, DWORD c) { 
        char s[100]; 
        _snprintf_s(s, _TRUNCATE, "%s: 0x%08lX", w, c); 
        return s; 
    }
    error_code (const char *w, DWORD c) : runtime_error(estr(w, c)) { }
};
 
 
int main () {
 
    try {
 
        auto_coinit coinit;
        _StreamPtr s;
        HRESULT r;
 
        r = s.CreateInstance(__uuidof(Stream));
        if (FAILED(r))
            throw error_code("CreateInstance", r);
 
        // stream test code starts here (open, set binary, write)
 
        r = s->Open(vtMissing, adModeUnknown, adOpenStreamUnspecified, _bstr_t(), _bstr_t());
        if (FAILED(r))
            throw error_code("Open", r);
 
        r = s->put_Type(adTypeBinary);
        if (FAILED(r))
            throw error_code("put_Type", r);
 
        _variant_t v;
        v.vt = VT_UI1;
        v.bVal = 'x';
 
        r = s->Write(v);
        if (FAILED(r))
            throw error_code("Write", r);
 
        // stream test code ends here
 
    } catch (const exception &x) {
 
        fprintf(stderr, "error: %s\n", x.what());
 
    }
 
    printf("finished\n");
    getchar();
 
}
[+][-]09/19/09 11:44 AM, ID: 25373993

Experts Exchange has a courteous staff of administrators who help members get the most out of the website by means of administrative comments like this one.

Start your 30-day free trial to view this Administrative Comment or ask the Experts your question.

 
[+][-]09/19/09 02:31 PM, ID: 25374755

Often, when Experts are collaborating with members who have asked questions, they will request additional information about the problem. Askers respond with an author comment like this one.

Start your 30-day free trial to view this Author Comment or ask the Experts your question.

 
[+][-]09/21/09 07:55 AM, ID: 25383536

Experts Exchange has a courteous staff of administrators who help members get the most out of the website by means of administrative comments like this one.

Start your 30-day free trial to view this Administrative Comment or ask the Experts your question.

 
[+][-]09/21/09 08:35 AM, ID: 25384003

At Experts Exchange, members can ask their questions to thousands of technology professionals, also known as Experts. Experts compete and collaborate to answer those questions by leaving comments like this one.

Start your 30-day free trial to view this Expert Comment or ask the Experts your question.

 
[+][-]09/21/09 02:19 PM, ID: 25387742

At Experts Exchange, members can ask their questions to thousands of technology professionals, also known as Experts. Experts compete and collaborate to answer those questions by leaving comments like this one.

Start your 30-day free trial to view this Expert Comment or ask the Experts your question.

 
[+][-]09/21/09 02:54 PM, ID: 25388027

Often, when Experts are collaborating with members who have asked questions, they will request additional information about the problem. Askers respond with an author comment like this one.

Start your 30-day free trial to view this Author Comment or ask the Experts your question.

 
[+][-]09/21/09 04:42 PM, ID: 25388698

View this solution now by starting your 30-day free trial. Setting up your free trial is quick, easy, and secure. We will return you to this solution, unlocked, when you're done.

 

About this solution

Zones: Databases Miscellaneous, Microsoft Visual C++, Microsoft Development
Tags: ado stream write safearray variant 0x800A0BB9
Sign Up Now!
Solution Provided By: DanRollins
Participating Experts: 2
Solution Grade: A
 
 
[+][-]09/21/09 05:19 PM, ID: 25388845

Often, when Experts are collaborating with members who have asked questions, they will request additional information about the problem. Askers respond with an author comment like this one.

Start your 30-day free trial to view this Author Comment or ask the Experts your question.

 
 
Loading Advertisement...
20090824-EE-VQP-74 - Hierarchy / EE_QW_3_20080625