Solved

string to sbyte* conversion error

Posted on 2006-06-28
16
3,228 Views
Last Modified: 2012-06-27
Hi,

      I have an open question in VC++.NET area. I got helped for part of the question. For the rest I need to post here. Below is the link to the question.

http://www.experts-exchange.com/Programming/Programming_Languages/Dot_Net/VisualC_PLUS_PLUS_DOT_NET/Q_21901100.html#17004595

      In short, I have an unmanaged dll in MFC C++ with signature

       void DoConversion(const char* videoIn, const char* videoOut)

     Then there is a managed wrapper class in C++.NET with function call like below

 public:
            [DllImport("anothertestproc.dll",
          EntryPoint = "?convertd@CanothertestprocApp@@QAEXPBD0@Z",
              CallingConvention = CallingConvention::ThisCall)]
        static void convertd(const char* videoIn, const char* videoOut);

      Now, I want to use this managed wrapper dll in my C# code with the signature as

            void convertd(string, string).

    But when I add the managed wrapper class as a reference, I get the signature as void convertd(sbyte*, sbyte*). I don't know why it needs that format. How do I manage this?

     
     Please help. Thanks.
0
Comment
Question by:payal1711
16 Comments
 
LVL 48

Expert Comment

by:AlexFM
Comment Utility
Please describe exactly what function do you want to call from C#: DoConversion or convertd. If you want to call convertd, how does in look in manage C++ project?
0
 
LVL 96

Expert Comment

by:Bob Learned
Comment Utility
Here is some light reading:

Stan Lippman's BLog -- "The absence of const support in the base class library…"
http://blogs.msdn.com/slippman/archive/2004/01/22/61712.aspx

Why doesn't C# have "const"?
http://blogs.msdn.com/oldnewthing/archive/2004/04/27/121049.aspx

The C++ 'const' Declaration: Why & How
http://duramecho.com/ComputerInformation/WhyHowCppConst.html

Was there a specific reason for the 'const' char*?

Bob
0
 
LVL 1

Author Comment

by:payal1711
Comment Utility

  Thanks AlexFM. I want to call convertd from my C# project. I have not overriden the method in my managed project. Here is how it looks in the unmanaged code and the managed code:

     - unmanaged code

       void CanothertestprocApp::convertd(const char* videoIn, const char* videoOut)  
{
            DoConversion(videoIn, videoOut);
}

  - managed code

  public:
            [DllImport("anothertestproc.dll",
          EntryPoint = "?convertd@CanothertestprocApp@@QAEXPBD0@Z",
              CallingConvention = CallingConvention::ThisCall)]
                             static void convertd(const char* videoIn, const char* videoOut);

      
     Thanks Bob for the links, I will read them and hopefully find something there. The reason for using const char* is the multimedia library that I am using has this type as its input type in the methods.
   
0
 
LVL 96

Expert Comment

by:Bob Learned
Comment Utility
I was wondering if you had control over the library, but it sounds like you don't.  Have you been able to get it to compile with sbyte* parameter?  I am also curious if you can't cast the sbyte* to a string explicitly.

Bob
0
 
LVL 1

Author Comment

by:payal1711
Comment Utility

   No, I cannot compile with sbyte* parameter and I didn't find any way to successfully convert a string to sbyte*. Looks like sbyte is used for string numericals and not string chars.
0
 
LVL 1

Author Comment

by:payal1711
Comment Utility

     I forgot to mention one more thing that CString also works. Because that can be casted to const char*. So if you have any solution using CString type that will also work.

     I have tried that but with no luck.

     Thanks.
   
0
 
LVL 96

Expert Comment

by:Bob Learned
Comment Utility
I'm sorry, but I didn't understand that last comment.  Are you saying that the C++ arguments would be CString?

Bob
0
Free Trending Threat Insights Every Day

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

 
LVL 1

Author Comment

by:payal1711
Comment Utility

   Yes. Below is what I meant. CString in the signature instead of const char*.
 
  - unmanaged code

       void CanothertestprocApp::convertd(CString videoIn, CString videoOut)  
{
          DoConversion(videoIn, videoOut);
}

  - managed code

  public:
          [DllImport("anothertestproc.dll",
          EntryPoint = "?convertd@CanothertestprocApp@@QAEXPBD0@Z",
            CallingConvention = CallingConvention::ThisCall)]
                             static void convertd(CString videoIn, CString videoOut);

0
 
LVL 96

Expert Comment

by:Bob Learned
Comment Utility
Here is a p/invoke response to a question about CString:

http://www.dotnet247.com/247reference/msgs/49/245492.aspx

<Quote>
extern APIENTRY WINAPI void F1(CString str1,CString str2)
{
F2(str1,str2);
}

/*intern*/ void F2(CString str1,CString str2)
{
//do stuffs ..;
}

I have this C# code :

[DllImport("my.dll", EntryPoint = "F1")]
public static extern bool csFct(string s1 ,string s2);
</Quote>

Bob
0
 
LVL 1

Author Comment

by:payal1711
Comment Utility

  I have already tried this. It doesn't implicitly convert from CStirng to .net String. I came through this post while searching for the same.

   Thanks.
0
 
LVL 1

Author Comment

by:payal1711
Comment Utility

   This is what I get as error: System.AccessViolationException: "Attempted to read or write protected memory. This is often an indication that other memory is corrupt."

 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string p2 = "C:\\bla105_050a_008_cp_001.avi";
            string p3 = "C:\\New Folder 2\\newimage_0001.tga";

            convertd(p2, p3);
        }

        [DllImport("anothertestproc.dll",
          EntryPoint = "?convertd@CanothertestprocApp@@QAEXV?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@0@Z",
            CallingConvention = CallingConvention.ThisCall)]
        private static extern void convertd(string videoIn, string videoOut);

    }
0
 
LVL 1

Author Comment

by:payal1711
Comment Utility

    I think the error is that it cannot access the DLL. Where should I place the dll so that it can see it?
     
0
 
LVL 1

Author Comment

by:payal1711
Comment Utility

   Thanks Bob for your help. I did receive my answer from the first thread for this question: the link is here:
http://www.experts-exchange.com/Programming/Programming_Languages/Dot_Net/VisualC_PLUS_PLUS_DOT_NET/Q_21901100.html

   Moderator, can you please refund me the points.

  Thanks everybody.
0
 
LVL 1

Accepted Solution

by:
DarthMod earned 0 total points
Comment Utility
PAQed with points refunded (100)

DarthMod
Community Support Moderator
0
 

Expert Comment

by:masums
Comment Utility
User ref class to wrap a unmanaged class
0

Featured Post

Enabling OSINT in Activity Based Intelligence

Activity based intelligence (ABI) requires access to all available sources of data. Recorded Future allows analysts to observe structured data on the open, deep, and dark web.

Join & Write a Comment

Introduction Although it is an old technology, serial ports are still being used by many hardware manufacturers. If you develop applications in C#, Microsoft .NET framework has SerialPort class to communicate with the serial ports.  I needed to…
This article is for Object-Oriented Programming (OOP) beginners. An Interface contains declarations of events, indexers, methods and/or properties. Any class which implements the Interface should provide the concrete implementation for each Inter…
This video discusses moving either the default database or any database to a new volume.
This demo shows you how to set up the containerized NetScaler CPX with NetScaler Management and Analytics System in a non-routable Mesos/Marathon environment for use with Micro-Services applications.

771 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now