View previous topic :: View next topic |
Author |
Message |
CodeScript Moderator Team
Joined: 08 Jun 2003 Posts: 1060 Location: India
|
Posted: Fri Sep 12, 2003 5:54 am Post subject: Passing a Variant variable,widecharacter to @LIB() |
|
|
Passing a Variant variable,widecharacter to @LIB()
=================================
Sometime back I encountered a DLL which required Variant type of variable. I tried INT: STR: nothing but it won't work. Is it possible to have this support in future ?
Also how about passing a widecharacter string as a parameter in @LIB() as newer APIs need this and have no ANSI counterpart. _________________ Regards
- CodeScript
Give your application a professional look with the VDSGUI Extension |
|
Back to top |
|
|
jules Professional Member
Joined: 14 Sep 2001 Posts: 1043 Location: Cumbria, UK
|
Posted: Fri Sep 12, 2003 8:04 am Post subject: |
|
|
These are all issues that may be considered when thinking about VDS 6. It might be possible to build a Variant using the @binary() function. I came across a description of the format once. There are several bytes at the beginning of each variable specifying type, length and so on. So it is not an efficient format, and VDS has always tried fo be fast and efficient.
Isn't it possible to use an API call to convert a standard string to wide format? _________________ The Tech Pro
www.tech-pro.net |
|
Back to top |
|
|
CodeScript Moderator Team
Joined: 08 Jun 2003 Posts: 1060 Location: India
|
Posted: Fri Sep 12, 2003 8:11 am Post subject: |
|
|
jules wrote: | Isn't it possible to use an API call to convert a standard string to wide format? |
Yes possible MultiByteToWideChar but mostly the function didn't work then. I will post an example when I come across once again. _________________ Regards
- CodeScript
Give your application a professional look with the VDSGUI Extension |
|
Back to top |
|
|
vdsalchemist Admin Team
Joined: 23 Oct 2001 Posts: 1448 Location: Florida, USA
|
Posted: Fri Sep 12, 2003 4:07 pm Post subject: Re: Passing a Variant variable,widecharacter to @LIB() |
|
|
CodeScript wrote: | Passing a Variant variable,widecharacter to @LIB()
=================================
Sometime back I encountered a DLL which required Variant type of variable. I tried INT: STR: nothing but it won't work. Is it possible to have this support in future ?
Also how about passing a widecharacter string as a parameter in @LIB() as newer APIs need this and have no ANSI counterpart. |
CodeScript,
Below is the definition of a VARIANT in LccWin32 you should be able to find the definition in the oaidl.h file for most of the C/C++ compilers.
Code: | struct _VARIANT {
union {
struct __tagVARIANT {
VARTYPE vt;
WORD wReserved1;
WORD wReserved2;
WORD wReserved3;
union {
LONG lVal;
BYTE bVal;
SHORT iVal;
FLOAT fltVal;
DOUBLE dblVal;
VARIANT_BOOL boolVal;
_VARIANT_BOOL bool;
unsigned long long ullVal;
SCODE scode;
CY cyVal;
DATE date;
BSTR bstrVal;
IUnknown *punkVal;
IDispatch *pdispVal;
SAFEARRAY *parray;
BYTE *pbVal;
SHORT *piVal;
LONG *plVal;
FLOAT *pfltVal;
DOUBLE *pdblVal;
VARIANT_BOOL *pboolVal;
_VARIANT_BOOL *pbool;
SCODE *pscode;
CY *pcyVal;
DATE *pdate;
BSTR *pbstrVal;
IUnknown **ppunkVal;
IDispatch **ppdispVal;
SAFEARRAY **pparray;
VARIANT *pvarVal;
PVOID byref;
CHAR cVal;
USHORT uiVal;
ULONG ulVal;
INT intVal;
UINT uintVal;
DECIMAL *pdecVal;
CHAR *pcVal;
USHORT *puiVal;
ULONG *pulVal;
INT *pintVal;
UINT *puintVal;
} __VARIANT_NAME_3;
} __VARIANT_NAME_2;
DECIMAL decVal;
} __VARIANT_NAME_1;
};
|
Notice it is a structure that has a member that is a UNION of different types. A union is like a structure but it is seen as a single variable and takes the size of the largest variable type listed in the union.
Now for question number 2. A WideChar is a character that takes 2 bytes if you are only sending ASCII characters only then the Wide string would be an array of WORD values with the first byte being the ASCII character and the second byte being a NULL character. I don't know what you were trying to do before but MultiByteToWideChar works for me. You know that the info box cannot show the null character so I made this simple script that replaces the null character with it's ASCII value to post it to an edit box to show that these functions do work with VDS 5.
Code: | #-----------------------------------------------------------------------------#
# #
# Default script template - to change it edit <vdspath>\default.dsc #
# #
# Author: Johnny Kinsey aka:MindPower #
# #
# Copyright: #
# #
#-----------------------------------------------------------------------------#
LoadLib kernel32.dll
%%CP_ACP = 0
DIALOG CREATE,New Dialog,-1,0,309,199
REM *** Modified by Dialog Designer on 9/12/2003 - 11:40 ***
DIALOG ADD,EDIT,EDIT1,45,34,239,38,EDIT1,,MULTI,WRAP,SCROLL
DIALOG ADD,TEXT,TEXT1,23,53,,,Type some text and click convert.
DIALOG ADD,BUTTON,BUTTON1,122,114,,,Convert
DIALOG SHOW
:evloop
wait event
goto @event()
goto close
:BUTTON1BUTTON
%A = @dlgtext(EDIT1)
If @Equal(@substr(%A,2),0)
%B = @Fill(@Div(@len(%A),2))
%%cnt = 1
repeat
%D = @Substr(%A,%%cnt)
if @Equal(%D,0)
%C = %C@chr(0)
else
%C = %C@Substr(%A,%%cnt)
end
%%cnt = @succ(%%cnt)
Until @Equal(%%cnt,@len(%A))
%R = @lib(kernel32,WideCharToMultiByte,INT:,%%CP_ACP,0,@ADDR("%C"),-1,@Addr("%B"),@Sum(@len(%B),1),NIL:,NIL:)
DIALOG SET,EDIT1,%B
Else
%B = @Fill(@Prod(@Sum(@len(%A),1),2))
%R = @lib(kernel32,MultiByteToWideChar,INT:,%%CP_ACP,0,STR:%A,-1,@ADDR("%B"),@Prod(@Sum(@len(%A),1),2))
%%cnt = 1
repeat
%D = @asc(@Substr(%B,%%cnt))
if @Equal(%D,0)
%C = %C0
else
%C = %C@Substr(%B,%%cnt)
end
%%cnt = @succ(%%cnt)
Until @Equal(%%cnt,@len(%B))
DIALOG SET,EDIT1,%C
End
%C =
%A =
%B =
goto evloop
:close
FreeLib kernel32
Exit
|
_________________ Home of
Give VDS a new purpose!
|
|
Back to top |
|
|
CodeScript Moderator Team
Joined: 08 Jun 2003 Posts: 1060 Location: India
|
Posted: Fri Sep 12, 2003 4:14 pm Post subject: |
|
|
Thanx for that I will check it. _________________ Regards
- CodeScript
Give your application a professional look with the VDSGUI Extension |
|
Back to top |
|
|
vdsalchemist Admin Team
Joined: 23 Oct 2001 Posts: 1448 Location: Florida, USA
|
Posted: Fri Sep 12, 2003 4:32 pm Post subject: |
|
|
CodeScript,
You can convert the strings with out the use of MultiByteToWideChar function but if your application will be used in languages that need Unicode support it is safer to use the MultiByteToWideChar function... _________________ Home of
Give VDS a new purpose!
|
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You can attach files in this forum You can download files in this forum
|
|