Link to home
Start Free TrialLog in
Avatar of payal1711
payal1711

asked on

string to sbyte* conversion error

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.

https://www.experts-exchange.com/questions/21901100/string-to-CString-conversion-error.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.
Avatar of AlexFM
AlexFM

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?
Avatar of Bob Learned
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
Avatar of payal1711

ASKER


  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.
   
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

   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.

     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.
   
I'm sorry, but I didn't understand that last comment.  Are you saying that the C++ arguments would be CString?

Bob

   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);

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

  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.

   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);

    }

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

   Thanks Bob for your help. I did receive my answer from the first thread for this question: the link is here:
https://www.experts-exchange.com/questions/21901100/string-to-CString-conversion-error.html

   Moderator, can you please refund me the points.

  Thanks everybody.
ASKER CERTIFIED SOLUTION
Avatar of DarthMod
DarthMod
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
User ref class to wrap a unmanaged class