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("anothertestpro c.dll",
EntryPoint = "?convertd@Canothertestpro cApp@@QAEX PBD0@Z",
CallingConvention = CallingConvention::ThisCal l)]
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.
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("anothertestpro
EntryPoint = "?convertd@Canothertestpro
CallingConvention = CallingConvention::ThisCal
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.
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?
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
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
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::conve
{
DoConversion(videoIn, videoOut);
}
- managed code
public:
[DllImport("anothertestpro
EntryPoint = "?convertd@Canothertestpro
CallingConvention = CallingConvention::ThisCal
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
Bob
ASKER
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.
ASKER
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
Bob
ASKER
Yes. Below is what I meant. CString in the signature instead of const char*.
- unmanaged code
void CanothertestprocApp::conve
{
DoConversion(videoIn, videoOut);
}
- managed code
public:
[DllImport("anothertestpro
EntryPoint = "?convertd@Canothertestpro
CallingConvention = CallingConvention::ThisCal
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
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
ASKER
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.
ASKER
This is what I get as error: System.AccessViolationExce
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string p2 = "C:\\bla105_050a_008_cp_00
string p3 = "C:\\New Folder 2\\newimage_0001.tga";
convertd(p2, p3);
}
[DllImport("anothertestpro
EntryPoint = "?convertd@Canothertestpro
CallingConvention = CallingConvention.ThisCall
private static extern void convertd(string videoIn, string videoOut);
}
ASKER
I think the error is that it cannot access the DLL. Where should I place the dll so that it can see it?
ASKER
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
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
User ref class to wrap a unmanaged class