Hello,
I'm in the process of writing a managed wrapper on legacy C++ code.
I have to deal with methods that are using the ellipsis.
For instance,the legacy method is :
void CLog::Print (LPCSTR szMask, ...)
{
CHAR szText[512];
va_list arglist;
va_start (arglist, szMask);
wvsprintfA (szText, szMask, arglist);
va_end (arglist);
}
The wrapper looks like this :
void Print(System::String ^ Text, array<Object^>^ args )
{
CStringA s((LPCTSTR)UnmanagedString(Text));
m_pLog->Print(s, args);
}
I'm calling the wrapper with this call :
log->Print("Hello, CallCount is [%d]", gcnew
array<Object^>(1){(System::Int32)1});
And the result is "Hello CallCount [3226976]" instead of "Hello CallCount
[1]"
Where is the problem ?
TIA.
adebaene@club-internet.fr - 17 Oct 2007 13:31 GMT
On Oct 17, 9:43 am, "Olivier Matrot"
<olivier.matrot....@online.nospam> wrote:
> Hello,
> I'm in the process of writing a managed wrapper on legacy C++ code.
[quoted text clipped - 24 lines]
>
> m_pLog->Print(s, args);
Here, you are passing an array<Object^>^ as the 1st ellipsis argument,
while the native part (eg, wvsprintf) expects an int. It not a
surprise it doesn't work..
I do not see any simple solution. IMHO, you should anyway get way of
those ugly, type-unsafe- c-styleish, ellipsis. You could for example
design your wrapper class to work like a stream or a StringBuilder.
Arnaud
Olivier Matrot - 17 Oct 2007 15:16 GMT
I agree with you, it is better to do the formating in managed C++.
However, I'm interrested in dealing with this for my personnal skills.
Olivier.
> On Oct 17, 9:43 am, "Olivier Matrot"
> <olivier.matrot....@online.nospam> wrote:
[quoted text clipped - 36 lines]
>
> Arnaud
David Anton - 17 Oct 2007 23:51 GMT
Why not use a C++/CLI parameter array?
e.g.,
void test(... array<System::Object^> ^ParamArray)

Signature
http://www.tangiblesoftwaresolutions.com
C++ to C#
C++ to VB
C++ to Java
C++ to C++/CLI
Instant C#: VB to C# converter
Instant VB: C# to VB converter
Instant C++: convert VB or C# to C++/CLI
> Hello,
> I'm in the process of writing a managed wrapper on legacy C++ code.
[quoted text clipped - 38 lines]
>
> TIA.
Olivier Matrot - 18 Oct 2007 13:43 GMT
I've changed the parameter in my code below with your suggestion. It
becomes:
void Print(System::String ^ Text, ... array<Object^>^ args )
The result is the same.
> Why not use a C++/CLI parameter array?
> e.g.,
[quoted text clipped - 43 lines]
>>
>> TIA.