|
|
Hi all
we have unmanaged C++ third party library which needs to be used in C# Environment. hence I am writing managed C++ wrapper on top
to use it in C# environment
I came across some of the situation put me into trouble.Can any one resolve my doubts
1) I was using the pin pointers to convert from managed string (String^) to unmanaged string(char * buffer)
is it safe? are there any performance issues with this ?
If then what is the best logic to do? please see the code snippet below i used
for converting from C# string to char * buffer(unmanaged string)
bool bRet = false;
pin_ptr<const wchar_t> w_string = PtrToStringChars(s);
size_t converted_chars = 0;
size_t size_bytes = ((s->Length + 1) * 2);
if ((size_bytes / 2) <= output_len)
{
memset(output, '\0', output_len);
if (!wcstombs_s(&converted_chars, output, output_len, w_string, size_bytes))
bRet = true;
}
return bRet;
2)Can i use System::Generic::Collections such as Dictionary and List for sending data from C# to managedC++
and viceversa?
I need to send collection of datasets from managed C++ to C# code. Can i use the List to do this.
if not are there any best practices to achieve this?
3)Is it necessary to use gc when i am creating any memory in managed C++
Waiting for ur reply
Thanks in advance
Sukumar
|
|
|
|
|
Hi,
1) I tend to use the msclr::interop::marshal_as templates for string conversions rather than pinning memory as they work in a nice tidy C++ RAII way, clearing up any temporary/locked memory when going out of scope. They handle stl, COM and straight const char * type conversions. See http://msdn.microsoft.com/en-us/library/bb384859.aspx[^]
2) Yes. Works just the same, except with C++/CLI syntax. You will need to do some translation (e.g. to copy into an stl data type) to send to purely native code though.
3) The general rule is if you are creating a managed object, use gcnew, otherwise use straight c++ new. The garbage collector will do the rest. You can still delete sooner if you want to.
Hope that helps.
|
|
|
|
|
Hi
Is it necessary to use delete when i am using gcnew to create an object
i got this code snippet from msdn deletes the context that was created by gcnew
is it correct?
marshal_context ^ context = gcnew marshal_context();
const char* str4 = context->marshal_as<const char*>(str);
puts(str4);
delete context;
|
|
|
|
|
The delete is not necessary as this is a references and the GC will collect that context object when there are no more outstanding references. The delete is probably just attempting to make it explicit and hope to clean up sooner from what I can tell.
|
|
|
|
|
Hi All,
Can any suggest me book that explains better for mangaged extenstions for VC++ for .Net Version 2.0 and above ?
|
|
|
|
|
Try Pro Visual C++/CLI for .Net 3.5 by Stephen Fraser from Apress
Ger
|
|
|
|
|
|
You do know that managed extensions has been deprecated for quite some time, and it's now C++/CLI, right?
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
You can do a lot worse than Nish's book, C++/CLI in action (see http://www.manning.com/sivakumar/[^] ). I found it a really good introduction to one of the better things to come out of Microsoft in recent years, C++/CLI. Highly recommended.
modified on Tuesday, July 5, 2011 4:33 AM
|
|
|
|
|
|
This maybe a common question, and maybe there are many articles and threads talking about the mixed coding.
But all the mixed coding seems prefer to using #pragram unmanaged/managed, and using dll import, something like this. I plan to make a winform program, and when I press some button, the program can call the unmanged function. So in that case, I should call the unamaged function in button click event, like this:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
// call the unmanaged function
CallUnmanaged();
}
However, I had compile error: 'CallUnmanaged': identifier not found. I tried to use extern the unmanged function in the managed codes, there are still many errors.
Anyone can tell me how to fix this without using dll import? just simpile function call. Thanks.
Best wishes
Joul
|
|
|
|
|
You must tell the compiler where to find the function typically by adding the appropriate include directive... or you somehow have to declare the function somewhere.
Is CallUnmanaged in another DLL? Is so, you have to properly export/import the function. If the function is in the same DLL then a simple declaration will do.
Typically function are declared in header files and header files then be included to use that function. If the function is uses across DLL, then it must be exported/imported as otherwise it would be visible from outside the original DLL.
Importing manged code is easier as we only have to add a reference to the DLL. For unmanaged function though, they mus be made visible to the compiler before being used by either including the file with the declaration or duplicating the declaration (normally not recommanded).
Philippe Mori
|
|
|
|
|
Thanks Mori, the CallUnmanaged function is defined by another .cpp native file of the project solution. That's I just want to call the CallUnmanaged function without through DLL. The compiler doesn't know the native function, that's the key problem. Maybe this is a simple question.
Joul
|
|
|
|
|
Well, generally all functions in a .cpp that are intended to be used from other files in the project should also be declared in the corresponding header. Then in the file where you want to call the unmanaged function, you just include that file.
In fact, this is the same for managed functions inside the project or any functions in standard librairies.
For this aspect C+/CLI works exactly as C++. The main difference with standard C++ is that when you add a reference to a managed DLL, all public symbols will be visible without any additionnal include to all file in that project. So for managed code outside the current project, C++/CLI behave more like C#.
ProjectA
unmanaged.h
void UnmanagedFunction();
unmanaged.cpp
#include "unmanaged.h"
void UnmanagedFunction()
{
}
other.cpp
#include "unmanaged.h"
void CallingFunction()
{
UnmanagedFunction();
}
Philippe Mori
|
|
|
|
|
Hi Mori,
Thanks for your kind help, I got your meanings and solved the problem. Many thanks
BW
Joul
|
|
|
|
|
I build an app w/VC++6. I design a window with an EDIT CONTROL (IDD_MYEDIT) , associate a CEdit control (m_myedit ). I switched on the PASSWORD style of the control.
Can be triggered this style on or off during the program running?
36. When you surround an army, leave an outlet free.
...
Do not press a desperate foe too hard.
SUN-TZU - Art of War
|
|
|
|
|
After the edit control has been created, the ES_PASSWORD style can't be changed.
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
i have an c++ application build with /clr option and have integrated crash reporting feature.
the crash dump it generates does not show line numbers when i debug the dump using windbg.
(i found that applications build with clr does not show line numbers)
it shows the function name where it crashed but not the exact line number. for eg
it shows:
03434456 02312434 CExApp::OnOpenFile() + 0x30c
Is there any way to calculate the line number by using the offset 0x30c ?
thanks
|
|
|
|
|
Luc Pattyn [My Articles] Nil Volentibus Arduum
The quality and detail of your question reflects on the effectiveness of the help you are likely to get. Please use <PRE> tags for code snippets, they improve readability. CP Vanity has been updated to V2.4
|
|
|
|
|
I am beginner in visual studio 2008 (C++/CLI) (Windows Form Application).
Can anyone help me Please..?
I want to know that how we can create multi-project solution in following way?
for example..
I have two projects "A" and "B".
can form of "B" called from "A"'s click event?
Thanks in advance.
|
|
|
|
|
If the two projects create executables, then you'll need some form of Interprocess Communication[^] for the two processes to communicate.
Or is one or more of the projects a library?
What are you trying to do?
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Thanks for your quick reply
I am studying the Interprocess Communication link that you suggested to me.
Neither the projects are any type of library
The scenario is as:
Our company have too many (more than 20 in numbers) products (Hardware units) needs separate UI to handle Inputs and Outputs.
1. It is difficult to handle different software application for each product.
2. If customer has more than one products of our company then he should be able to select dynamically which application will run.
so I am trying to integrate all the needed and related applications in one solution.
|
|
|
|
|
If you just have a main solution (creating an executable) and all you're trying to do is spawn other applications when a users selects something within the main app, then its easy, all you have to do is know how to start the secondary application.
|
|
|
|
|
If projects are managed DLL, then you could do anything you want. The only thing to be aware is that reference to others DLL are unidirectionnal.
Assuming that each project are independant of the other, you could then have:
- ProjectA.dll (managed DLL with forms for A)
- ProjectB.dll (managed DLL with forms for B)
- ProjectC.dll (managed DLL with forms for C)
- MainApplication.exe (main application with reference to other DLLs)
MainApplication will then be able to uses any public forms in other DLLs. It will be able to uses events generated by those forms.
You may also need to add an extra DLL that will be referenced by each project if you need some common functionality.
By the way, then main application I have developped has many C++/CLI and many C# DLL.
I prefer to uses C# for the UI as design-time support is far superior. The main problem with that is that when refactoring code, sometimes, I have to convert some C++/CLI code to C# and vice-versa. I was using .NET Reflector with C++/CLI plug-in but now the new version is a paid product and old plug-in does not seems to be supported.
Philippe Mori
|
|
|
|