|
You don't need P/Invoke, you need a mixed-mode app or DLL. Polymorphism works the same way irrespective of whether you call it from native code or mixed mode code.
Regards,
Nish
|
|
|
|
|
Hello,
Thank you for the clarification. I thought of trying this problem in baby steps as mentioned below:
(1) Have a singleton unmanaged class (say X), shared across managed C++ and native C++.
(Please note a big assumption here. I'm not sure whether this makes sense as the heaps of native and managed worlds are handled differently.
(2) Set Derived class instance in X's singleton instance. X stores this instance in a base class pointer.
(3) Call virtual method on this base class pointer for native client derived class implementation to get executed.
But I'm 100% doubtful about step-1. It is because the heaps of native and managed worlds are different.Is this correct? Is there any alternative way to share the instance of a class between native and managed boundaries using IJW? At least can I use GlobalAlloc() to allocate the bytes to share across managed and native worlds?
How does .NET runtime know when to allocate on managed heap and when to allocate on native heap? Does it decide based on the caller (client)?
Thank you & Best Regards
-- modified at 19:07 Thursday 19th January, 2006
|
|
|
|
|
Native objects are created on the C++ heap (when you use new ) and managed objects are created on the garbage collected CLR heap (when you use gcnew ). There's currently no confusion since you can use new only with native objects and gcnew only with managed objects.
Regards,
Nish
|
|
|
|
|
Hello,
Thank you for the quick response.
I was able to call native overridden virtual function (with no parameters) using polymorphism between Managed and Native C++ via a native DLL (compiled by VC6 compiler). I tried to extend my sample with one managed structure as parameter to the native virtual function. VC6 compiler compiled the sources and generated lib/dll for the new changes successfully.
However, I noticed below compilation error while trying to compile MC++ client using the native header:
error C3383: 'AimAdpCBBase::notify' : in an unmanaged class, a virtual member function cannot have a managed type in the signature
I read the explanation for this in MSDN. And found some articles on google stating this feature is prohibited due to performance overheads with the involved transistions from managed-native-managed. But do you know any alternative to get around this error?
One alternative may be by using gcroot template around the managed type in the native function. This might work with VC7 compiler to generate lib/dll with CLR option. But VC6 compiler doesn't know about gcroot, vcclr.h, mscorlib.dll, /clr option etc.
How to make this work between VC6 compiler and MC++ compiler?
ps:- Another question, Does gcroot support pointer to a managed struct also?
Thank you & Best Regards,
-- modified at 18:47 Monday 23rd January, 2006
|
|
|
|
|
hi;
please tell me how to create a string array
char *p[] do not work;
thanx.
Kanchana
|
|
|
|
|
hmklakmal wrote: please tell me how to create a string array
char *p[] do not work;
array<String^>^ strarr;
Regards,
Nish
-- modified at 11:28 Wednesday 18th January, 2006
|
|
|
|
|
|
toxcct wrote: very intuitive syntax though...
Yeah, it can be a tad confusing initially.
Regards,
Nish
|
|
|
|
|
Dont work that one.
Kanchana
|
|
|
|
|
hmklakmal wrote: Dont work that one.
How exactly does it not work?
Regards,
Nish
|
|
|
|
|
|
Found the problem.
StreamReader ^sr = gcnew StreamReader(File::OpenRead("test.txt"), Encoding::Default);
|
|
|
|
|
Interesting! I'd have thought, that'd have been the default.
Regards,
Nish
|
|
|
|
|
So did i...
I have found this in msdn:
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEV.v10.en/passport25/NET_Passport_VBScript_Documentation/Single_Sign_In/Advanced_Single_Sign_In/Localization_and_LCIDs.htm
for slovenian i need to set "windows-1250", but i coudn't find any way to change to this encoding, when i have tried Encoding::Default just for fun. And it worked. I think this encoding chose it self based on windows configuration.
|
|
|
|
|
Saksida
I just went through the source (using Reflector). When you don't specify an encoding, it uses UTF8 by default. Hence your problem. Now that makes sense I guess.
Regards,
Nish
|
|
|
|
|
I can only specificy (the way i know):
UTF7
UTF8
UTF32
Unicode
ASCII
and of course Default.
but my program requires:
windows-1250
How can i set other encoder like windows-1250 without using default?
|
|
|
|
|
Saksida Bojan wrote: but my program requires:
windows-1250
How can i set other encoder like windows-1250 without using default?
You can use Encoding::GetEncoding("windows-1250")
Regards,
Nish
|
|
|
|
|
Thanks for the help.
Do you know where can i get entire list for encoding?
|
|
|
|
|
hi guys;
the IMediaSeeking @ Duration didn't work, any thougth about that?
thanks
|
|
|
|
|
What library are you talking about there?
Regards,
Nish
|
|
|
|
|
#pragma once
using namespace System;
using namespace System::Runtime::InteropServices;
namespace QuartzTypeLib
{
[StructLayout(LayoutKind::Sequential), ComVisible(false)]
public ref class DsOptInt64
{
public:
DsOptInt64( long Value )
{
this->Value = Value;
}
long Value;
};
[Flags, ComVisible(false)]
public enum class SeekingCapabilities // AM_SEEKING_SeekingCapabilities AM_SEEKING_SEEKING_CAPABILITIES
{
CanSeekAbsolute = 0x001,
CanSeekForwards = 0x002,
CanSeekBackwards = 0x004,
CanGetCurrentPos = 0x008,
CanGetStopPos = 0x010,
CanGetDuration = 0x020,
CanPlayBackwards = 0x040,
CanDoSegments = 0x080,
Source = 0x100 // Doesn't pass thru used to count segment ends
};
[Flags, ComVisible(false)]
public enum class SeekingFlags // AM_SEEKING_SeekingFlags AM_SEEKING_SEEKING_FLAGS
{
NoPositioning = 0x00, // No change
AbsolutePositioning = 0x01, // Position is supplied and is absolute
RelativePositioning = 0x02, // Position is supplied and is relative
IncrementalPositioning = 0x03, // (Stop) position relative to current, useful for seeking when paused (use +1)
PositioningBitsMask = 0x03, // Useful mask
SeekToKeyFrame = 0x04, // Just seek to key frame (performance gain)
ReturnTime = 0x08, // Plug the media time equivalents back into the supplied LONGLONGs
Segment = 0x10, // At end just do EC_ENDOFSEGMENT, don't do EndOfStream
NoFlush = 0x20 // Don't flush
};
[ComVisible(true), ComImport,
Guid("36b73880-c2c8-11cf-8b46-00805f6cef60"),
InterfaceType( ComInterfaceType::InterfaceIsIUnknown )]
public interface class IMediaSeeking
{
[PreserveSig]
int GetCapabilities(SeekingCapabilities &pCapabilities );
[PreserveSig]
int CheckCapabilities( [In, Out] SeekingCapabilities &pCapabilities );
[PreserveSig]
int IsFormatSupported( [In] Guid& pFormat );
[PreserveSig]
int QueryPreferredFormat( [Out] Guid& pFormat );
[PreserveSig]
int GetTimeFormat( [Out] Guid& pFormat );
[PreserveSig]
int IsUsingTimeFormat( [In] Guid& pFormat );
[PreserveSig]
int SetTimeFormat( [In] Guid& pFormat );
[PreserveSig]
int GetDuration( long& pDuration );
[PreserveSig]
int GetStopPosition( long& pStop );
[PreserveSig]
int GetCurrentPosition( long &pCurrent );
[PreserveSig]
int ConvertTimeFormat( long& pTarget, [In] Guid& pTargetFormat,
long& Source, [In] Guid& pSourceFormat );
[PreserveSig]
int SetPositions(
[In, Out, MarshalAs(UnmanagedType::LPStruct)] DsOptInt64^ pCurrent,
SeekingFlags dwCurrentFlags,
[In, Out, MarshalAs(UnmanagedType::LPStruct)] DsOptInt64^ pStop,
SeekingFlags dwStopFlags );
[PreserveSig]
int GetPositions( long &pCurrent, long &pStop );
[PreserveSig]
int GetAvailable( long &pEarliest, long &pLatest );
[PreserveSig]
int SetRate( double dRate );
[PreserveSig]
int GetRate( double& pdRate );
[PreserveSig]
int GetPreroll( long &pllPreroll );
};
}
|
|
|
|
|
Are you trying to use CCW on the Quartz library (I assume it's a COM library). And if so, in what way is it not working? You said Duration failed - do you mean that a call to GetDuration failed?
If the error is more on the COM side, you might have to repost this question in the COM forum.
Regards,
Nish
|
|
|
|
|
After having such a piss-poor time with VS2005 destroying WinForms whenever I alter resX files, I gave up on it and put string literals directly in code. Now that I'm going back and doing cleanup, I want to remove those and put them into a resource file. Has anybody else had this same problem with C++/CLI projects? If so, how are you managing string resources?
|
|
|
|
|
If you can outline the minimal steps to reproduce the problem, I can check if I get it too.
Regards,
Nish
|
|
|
|
|
I asked the same question on the MSDN forums and received a good suggestion to create a second resX file and placed localizable strings in there. I think I'm going to do that.
|
|
|
|
|