De-Referencing A Pointer

John C johnch_atms at hotmail.com
Tue Mar 21 09:15:02 PST 2006


"James Dunne" <james.jdunne at gmail.com> wrote in message 
news:dvpa6h$ltk$1 at digitaldaemon.com...
> NoBoDy wrote:
>> VB6 internally stores strings in UNICODE.
>> When calling external functions VB6 uses stub to convert string to/from 
>> ANSI
>> format.
>>
>> If you want to pass string from VB in Unicode use declaration like this:
>> Declare Function findChar Lib "..." (ByVal t As LONG) As Long
>>
>> and call that function as:
>> retValue = findChar(StrPtr("Some string"))
>>
>> this will pass pointer to UNICODE string to externall function findChar
>>
>>
>> In article <dvp71g$hv1$1 at digitaldaemon.com>, James Dunne says...
>>
>>>Rory Starkweather wrote:
>>>
>>>>>void foo(dchar c) {}
>>>>>void main()
>>>>>{
>>>>> foo('a');
>>>>>}
>>>>>
>>>>>so you'll probably have no trouble there. :)
>>>>>
>>>>
>>>>
>>>>
>>>>Thanks for the help. I'm still not sure how to get VB to send a dchar, 
>>>>but there
>>>>are only a couple of possibilities. Unless you are suggesting that I 
>>>>pass it to
>>>>D as a string and then use a conversion function on it.
>>>>
>>>>
>>>
>>>Actually you want to use wchar* at the D end from VB.  VB sends 'Unicode' 
>>>strings where each character is represented by two bytes. This is the 
>>>equivalent of a wchar* in D.  char, wchar, and dchar in D are all 
>>>more-or-less interchangeable.  The best way to get VB and D to do string 
>>>work together is this:
>>>
>>>Declare Function findChar Lib "..." (ByVal t As String) As Long
>>>
>>>export extern (Windows) int findChar(wchar* str) {
>>> ...
>>>}
>>>
>>>I'm not 100% sure if this works as I've had serious issues with VB6's 
>>>string handling in the past (especially in scenarios like this).  I think 
>>>the trick is to initialize the string from VB's side and pass it in to 
>>>C/C++/D for them to modify it.  I'll do some more research on this and 
>>>get you a better answer if I can.
>>>
>>>-- 
>>>-----BEGIN GEEK CODE BLOCK-----
>>>Version: 3.1
>>>GCS/MU/S d-pu s:+ a-->? C++++$ UL+++ P--- L+++ !E W-- N++ o? K? w--- O 
>>>M--@ V? PS PE Y+ PGP- t+ 5 X+ !R tv-->!tv b- DI++(+) D++ G e++>e h>--->++ 
>>>r+++ y+++
>>>------END GEEK CODE BLOCK------
>>>
>>>James Dunne
>>
>>
>>
>
> Thanks!  That helps a lot for me as well.  So then am I still correct in 
> that D should work with a wchar* ?
>
> BTW, do you have an MSDN reference for that info?
>
> -- 
> -----BEGIN GEEK CODE BLOCK-----
> Version: 3.1
> GCS/MU/S d-pu s:+ a-->? C++++$ UL+++ P--- L+++ !E W-- N++ o? K? w--- O 
> M--@ V? PS PE Y+ PGP- t+ 5 X+ !R tv-->!tv b- DI++(+) D++ G e++>e h>--->++ 
> r+++ y+++
> ------END GEEK CODE BLOCK------
>
> James Dunne

VB strings are equivalent to COM's BSTR (which is wchar*), so you should be 
using SysAllocString and SysFreeString on the D side, just as you would with 
COM in C/C++.

This article has some good pointers for interfacing VB with C++, which might 
help. http://www.flipcode.com/articles/article_vbdlls.shtml 





More information about the Digitalmars-d-learn mailing list