CString to BSTR question dealing with nul characters

I'm creating a C++ DLL for a VB application. I'm using VC7 for creating
the DLL application. I'm trying to return a string from this function,
here is a simple example

extern "C" DLL_API int __stdcall GetString(BSTR* myStr)
{
    int rtnCode = PASS; // PASS is defined as 1 somewhere else

    CString temp = "Hello";

   *str = temp.AllocSysString();

  return rtnCode;
}

>From my test VB 6 app I declare
Private Declare Function GetString GetStr "My.dll" (ByRef  myStr As
String,) As Integer

Dim tempStr as String
Dim rtnCode as Integer

rtnCode = GetString(tempStr)


I call the this funciton from my VB 6 application and passes
successfully. BUT I'm getting extra nul characters.

I converted tempStr into a Byte array to check out the individual
bytes. Dim b() as Byte
b = tempStr

I got the following
b(0) = 72
b(1) = 0
b(2) = 0
b(3) = 0
b(4) = 101
b(5) = 0
b(6) = 0
b(7) = 0
b(8) = 108
b(9) = 0
b(10) = 0
b(11) = 0
b(12) = 108
b(13) = 0
b(14) = 0
b(15) = 0
b(16) = 111
b(17) = 0
b(18) = 0
b(19) = 0

While if I declare
Dim anotherStr as String
anotherStr = "Hello"
b = anotherStr

The byte array for this is
b(0) = 72
b(1) = 0
b(2) = 101
b(3) = 0
b(4) = 108
b(5) = 0
b(6) = 108
b(7) = 0
b(8) = 111
b(9) = 0

So am kinda of confused the best way to convert a CString to a BSTR.
Thanks for any help or information.

0
1/3/2006 8:43:25 PM
vc.mfc 33608 articles. 0 followers. Follow

3 Replies
465 Views

Similar Articles

[PageSpeed] 23

The problem is that your DLL is sending back unicode strings.

See if this article helps

http://www.codeproject.com/dll/BSTR_CString_conversion.asp

AliR.

"Danny" <fernandez.dan@gmail.com> wrote in message
news:1136321005.300665.201720@g44g2000cwa.googlegroups.com...
>
> I'm creating a C++ DLL for a VB application. I'm using VC7 for creating
> the DLL application. I'm trying to return a string from this function,
> here is a simple example
>
> extern "C" DLL_API int __stdcall GetString(BSTR* myStr)
> {
>     int rtnCode = PASS; // PASS is defined as 1 somewhere else
>
>     CString temp = "Hello";
>
>    *str = temp.AllocSysString();
>
>   return rtnCode;
> }
>
> >From my test VB 6 app I declare
> Private Declare Function GetString GetStr "My.dll" (ByRef  myStr As
> String,) As Integer
>
> Dim tempStr as String
> Dim rtnCode as Integer
>
> rtnCode = GetString(tempStr)
>
>
> I call the this funciton from my VB 6 application and passes
> successfully. BUT I'm getting extra nul characters.
>
> I converted tempStr into a Byte array to check out the individual
> bytes. Dim b() as Byte
> b = tempStr
>
> I got the following
> b(0) = 72
> b(1) = 0
> b(2) = 0
> b(3) = 0
> b(4) = 101
> b(5) = 0
> b(6) = 0
> b(7) = 0
> b(8) = 108
> b(9) = 0
> b(10) = 0
> b(11) = 0
> b(12) = 108
> b(13) = 0
> b(14) = 0
> b(15) = 0
> b(16) = 111
> b(17) = 0
> b(18) = 0
> b(19) = 0
>
> While if I declare
> Dim anotherStr as String
> anotherStr = "Hello"
> b = anotherStr
>
> The byte array for this is
> b(0) = 72
> b(1) = 0
> b(2) = 101
> b(3) = 0
> b(4) = 108
> b(5) = 0
> b(6) = 108
> b(7) = 0
> b(8) = 111
> b(9) = 0
>
> So am kinda of confused the best way to convert a CString to a BSTR.
> Thanks for any help or information.
>


0
AliR3470 (3236)
1/3/2006 9:04:43 PM
Thanks AliR,

I figured that was my problem but I didn't know where to change it, I
was trying in my DLL. So the only way to handle the Unicode conversion
is at the VB side with the call to the VB function StrConv, cool.

Thanks

Danny

0
1/3/2006 9:36:59 PM
> I figured that was my problem but I didn't know where to change it, I
> was trying in my DLL. So the only way to handle the Unicode conversion
> is at the VB side with the call to the VB function StrConv, cool.

No... The problem is that your DLL wasn't compiled with the _UNICODE define.
If it had been, then your original code would have worked just fine.  Since
it wasn't, the internals of Automation call *thought* you were returning a
"narrow" string and "widened" it for you (by adding the extra layer of
zeros). But by using the "already widened" AllocSysString call, that was an 
invalid combination.

If you change the C++ preprocessor define from _MBCS to _UNICODE it should
work just fine. [but, of course, then you have the problem that your DLL is 
a Unicode DLL and only works on WinNT-based system... but if that's okay, 
then that's the way to fix this.]

Also note that String variables in VB6 *are* Unicode (nominally 
2-bytes/character). So the only reason you should need to use the StrConv 
function is if you are dealing with an Ansi interface (e.g. as the website 
AliR pointed out for ListBox control).

Otherwise, a _UNICODE DLL returning an AllocSysString to VB6 is exactly what 
goes in a String.

Bob 


0
1/5/2006 4:12:50 AM
Reply:

Similar Artilces:

Questions about rebuilding a db 03-28-10
Lateley I've notices my database freezing from time to time, so I tried the following... a) created a new data base b) imported all tables, queries, forms, ...... ,modules c) reset the References d) reset the Startup options e) compile Everything is working great now, but I have a few questions about this process. Did I miss any crucial steps? (don't want any surprises later) Is there a prefered order to do these steps? Finally, the database is now about 30% smaller, even though I was regularly compiling, compacting/repairing the former one. I'd like to know w...

Conditional format to determine if last character in a cell is a number or a letter
I have a spreadsheet where I enter weights. The weights can be any whole number 1-99999. I would like to be able to flag suspicious weights using conditional formatting by putting a letter as the last character, such as 123a, or 57b, 4471c, etc.What conditional formatting formula can I use to accomplish this? Thanks, Tonso Assuming your weights are in column A, starting with A2, highlight the cells in that column with A2 as the active cell, and use this formula in the CF dialogue box: =3DAND(CODE(UPPER(RIGHT(A2)))>=3D65,CODE(UPPER(RIGHT(A2)))<=3D90) Then click on the Format button a...

microsoft publisher question
Is there any way to retrieve a document that wasn't saved? Doubtful. You might get lucky and Publisher created a temp file. In Windows Explorer, type %temp% in the address bar. Find any file that has a pub prefix. Change the .tmp to .pub and try opening it. -- Mary Sauer http://msauer.mvps.org/ "llcoby" <llcoby@discussions.microsoft.com> wrote in message news:F76C488D-E9CB-469C-AE5C-BC720692437A@microsoft.com... > Is there any way to retrieve a document that wasn't saved? ...

Installation of CRM on SBS 2003 Question
When installing CRM 3.0 on Microsoft SBS 2003 will installing into the default web site cause any problems with any thing else running from there such as Outook Web access, sharepoint, etc? Is it better to create a "new web site" when installing? Thanks, John Lammey You should create a new website. -- Matt Wittemann http://icu-mscrm.blogspot.com "John Lammey" wrote: > When installing CRM 3.0 on Microsoft SBS 2003 will installing into the > default web site cause any problems with any thing else running from there > such as Outook Web access, sharepoint,...

Excel question reposted
Hi I am reposting this problem with more detail in the hope that there is a workaround to this. Initially what I did was created a spreadsheet and then pasted 'screenshots' into the spreadsheet with comments bedside. I then shared the workbook, as I require other people's comments. Once they have entered their comments in the spreadsheet, I will then move the pasted screenshots and all comments to another 'Sheet'. The problem is that now that the spreadsheet is shared, I cant move the pictures. Thanks again Julia It's true that there are significant restricti...

Outlook 2010 question
I want to delete my existing pst folders and start over with a pst that I have saved to a safe location. How do I do that? You delete the present pst and put the pst files that you have backed up manually back in the same place from where you deleted the present pst -- Peter Please Reply to Newsgroup for the benefit of others Requests for assistance by email can not and will not be acknowledged. This posting is provided "AS IS" with no warranties, and confers no rights. http://www.microsoft.com/protect "RichCo" <richcolo@gmail.com> wrote in message news:4cd59...

Physical inventory question #3
I have a customer that is looking at an inventory last month and in the Summary box it shows what quantities and values were expected, however, when I click Print and export the data to CSV, the expected totals do not match what is in the summary box. Any ideas? Is there a way to subtotal the Active report when printed to screen? Thanks in advance. Phil Try the 2nd icon "select columns to group" on the top of the report. You can subtotal them by what column you choose to group them by. "Phil V" wrote: > I have a customer that is looking at an inventory last...

Exchange 5.5 IMC question
Hi, anyone know how to stop an Exchange 5.5 IMC from recieving but still allow it to send?? Cheers John On the Connections tab, set the Transfer Mode to Outbound Only. Restart the IMS. -- Denis McDowell [MSFT] "John" <John@4sol.com> wrote in message news:OnQV9krLEHA.2612@TK2MSFTNGP10.phx.gbl... > Hi, > > anyone know how to stop an Exchange 5.5 IMC from recieving but still allow > it to send?? > > Cheers > > John > > Great tip!! This is the answer to my problem (see the "Can I run NAV on received e-mails?"). I need to install NA...

User Form Security Question
Hi, I'm creating a form, which onces completed transfers the data over to the spreadsheet. But the guys in work don't really pay much attention to what they have entered , so i was wondering is there any way to make the user double check every entry? I was thinking, once the user clicks ok, a msgbox would appear giving the user the value they entered, click ok if correct or cancel to amend. Is there a easy way to do this? Cheers. -- harpscardiff ------------------------------------------------------------------------ harpscardiff's Profile: http://www.excelforum.com/mem...

Checkbox customization question
How can I implement checkbox in MSCRM ? I have a contacts with multiple professions. From a list of available professions as checkboxes, the user should be able to check all the applicable professions. Any ideas. Try Powertrak Core from www.axonom.com "Arch" <discussion11@yahoo.com> wrote in message news:b87a74db.0405210819.3232b5d8@posting.google.com... > How can I implement checkbox in MSCRM ? I have a contacts with > multiple professions. From a list of available professions as > checkboxes, the user should be able to check all the applicable > professions. Any...

address database question
I am setting up an address database in Excel 2003 that I need to be able to use to make labels for mailings. I have people that are in different "categories" and will want to group them by that category, depending on who I am sending the mailing to. For instance, I have a person, Person A, who is a general supporter, lives in the area, and sponsors a child. Person A is in three of the possible 5 categories. Another person, Person B, might be simply a general supporter (i.e., in one category). How can I best organize the data - and the headings - so that I can make labels ...

overtime charging question
A B C date hours worked 9 name hours offered 10 hours charged 3 Hi I have a sheet set up this way and want to chart overtime. Anything over 8 hours is time and a half, Saturday's are time and a half all day and Sunday is double charge.How can i set this up so it recognizes the date and charges correctly on the weekends. Will Excel recognize the date as weekend? The example above shows someone working 9 but offered 10 so charged 1 1/2 x 2 or 3 hours charged. Thanks Karl Karl Chip Pearson has a good sit...

eConnect question #3
When integrating inventory items via eConnect, is it possible to assign the item to all existing sites? Tony: Yes you can do that - by building your own code in the taUpdateCreateItemRcdPost procedure - I added the following code and now when I pass one item all of the sites of I have set up are now inserted into the IV00102 table. I just did a quick test and it seemed to work out fine. Here is the simple code you would add to the post procedure. I hope this is what you are looking for - I built this on 9.x (hopefully it pastes in here okay). Code to insert: insert into IV00102 (I...

Security Model Design Question
Poke a Hole in this Security Model! I think I have a pretty good security design, but wanted a second opinion :). The following Security model works – however, I have to lock the user out of Excel downloads and Mail merges so that the user can’t download the company’s entire contact list. Am I overlooking something that would allow users to own individual Accounts and Contact, yet preclude others from seeing opportunities attached to contacts they own? Background Assumptions 1 – Some sales reps are organized Geographically – others are organized Functionally (by industry). 2 – Sales...

Shared Borders Question....
Can 'Shared Borders' be .asp rather than .htm? There is a particular script I will like to run, but it can not be .htm. Thanks David No. -- Tom [Pepper] Willett Microsoft MVP - FrontPage Since 1997 --------------------------- "116" <116@discussions.microsoft.com> wrote in message news:52CEB706-E273-461F-9DD9-483EBA3C1F57@microsoft.com... : Can 'Shared Borders' be .asp rather than .htm? There is a particular script : I will like to run, but it can not be .htm. : : Thanks : David The shared border files must be .htm - left.htm, righ...

listview insert question
I am really having a time determining what is wrong with the inserting from a dropdownlist inside a listview. Everything else is working regarding the listview, except the insert. But, there must partially working as there is a new row added to the table, just not with information. When I add SelectedValue='<%# Bind("ApplicationItemID") %>' to the droplist I get an error. The error is as follows; "Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control." I have an insertcommand a...

"newbie" question using exchange
we have a new install of exchange using sbs 2003. What we would like to do is setup mail folders for three different user accounts that are accessable by all users. I would like for mail that is sent to these accounts (eg: orders@companyname.com) to be sent to the appropriate "public" folder. Could someone give me some direction on setting this up? Any alternate suggestions would be appreciated. Here is a link that explains how to do what you are looking for: http://www.msexchange.org/articles/MF021.html The link relates to Exchange 2000 but the steps are the same. -- Mark Fuga...

Garbled characters in sent messages
Hello, I've recently discovered that OWA (and from some OWA clients only) started to send garbled characters instead of non-ASCII characters. I've tried changing how OWA works, but to no avail. For example, I get the following headers and text (it's the same if I use the default Content-Transfer-Encoding): Subject: Test Date: Mon, 10 Oct 2005 17:05:17 +0300 Message-ID: Mime-Version: 1.0 Content-Type: multipart/alternative; boundary=3D"----_=3D_NextPart_001_01C5CDA3.A4509C5A" X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: Test Content-class: urn:content-classes:m...

Setup new acct question...
I am trying to add a new bank account in 2004. When it comes to assigning a FI I am only given the choice, in a drop down list, of the accts that have previously been set up. How do I manage to get a new bank name assigned? tia In microsoft.public.money, John h wrote: >I am trying to add a new bank account in 2004. When it comes to assigning a >FI I am only given the choice, in a drop down list, of the accts that have >previously been set up. How do I manage to get a new bank name assigned? AccountList->SetUpAccounts->AddANewAccount and type the name of the bank int...

Display count of characters in a cell while typing.
Not sure if this should be here or in the worksheet.functions newsgroup but I think here is a safe spot. As a user types text into a cell I would like to have another cell display the number of characters that are currently in it. The count has to be 'live', meaning that as the person is typing the counter is updating, not simply updating after the user has pressed 'Enter'. Alternately, a count-down counter would be even nicer ;-) Suggestions? Search brought up nothing. -- Toby Erkson Oregon, USA Excel 2002 in Windows XP Hi not really possible as macros don&#...

A question about CCommandLineInfo
I want to write an application that if it is given no command line arguments, it will run in a GUI mode. However, if the user passes any command line arguments, it means that he wishes to execute the program in a "automatic" mode, therefore I want it to in this case run and eject information to the console. I want it to be a single application to help reduce redant code. - Christopher Dannemiller. This is a common question. I've never seen a good answer for it, mostly because I think the idea basically is a Bad Idea anyway. joe On 3 Jun 2005 15:54:00 -0700, chris.dannemil...

DISP_FUNCTION_ID and ON_EVENT question
Hi, When I used: AfxConnectionAdvise (pSrcUnk, __uuidof (ISomeInterfaceEvents), GetIDispatch(TRUE), TRUE, &m_cookie); in a CCmdTarget derived class. I expected that I will be able to use ON_EVENT but it didn't work but DISP_FUNCTION_ID. Can any one explain this and what is the difference between DISP_FUNCTION_ID and ON_EVENT Thanks in advance ...

Question on MDI Apps #2
I am creating an MDI app that will have a variety of dialog boxes that will be displayed from clicking on Menu items. ex. Customers, Vendors, Inventory etc. I want to have the ability to have a single copy of each of these open at the same time. ex. both the customer and inventory dialog box open at the same time in the app. I also want to have them both listed in the Window menu. Should I use a Modeless Dialog Box or should I use a FormView? If you say a FormView, I know how to display a dialog box from a menu click but how do you display a formview based on a menu click? Also if you say...

Foreign fonts (special characters) not shown in word/excel
Hi! I work a lot with Hungarian translations at the moment. There are 2 characters that are not shown in office documents (neither 98 nor 2001). The characters missing are the "o" and "u" with "Doppel-Akut". Their unicodes are 337 and 369. The characters are shown without any problem on the PC. We need to put the Hungarian translations into QuarkXpress. Even if I copy the text out of a PDF the characters are already missing in the clipboard. Apparently, there is an Office multilanguage kit for Mac that installs the Arial font completely new so that all characte...

Capability questions
We are currently evaluating MSCRM and are wondering if it is possible to do a couple of things. 1) Mailmerge/emailmerge related party information. ie if we have a referral relationship can I send an email like... Hi {Lead:firstname}, you were referred to use by {referal:firstname} 2) Can you have relationship roles for a lead? 3) Can I run a workflow rule on a closed opportunity? I want to schedule a task based on a maturity date stored in the opportunity entity 4) Can I use attributes from a custom entity in an email or word merge? Can I create custom placehol...