Mark Jerde
2005-03-29 19:38:06 UTC
I'm trying to learn the very basics of using an unmanaged C++ DLL from C#.
This morning I thought I was getting somewhere, successfully getting back
the correct answers to a C++ " int SumArray(int ray[], int count)"
Now I'm having problems with C++ "return(false)" being True in C#.
Here is the C# code.
=========================
using System;
using System.Runtime.InteropServices; //
namespace GUI_03
{
class Class1
{
[DllImport("Test05.dll")]
public static extern bool IsEven(int num);
[DllImport("Test05.dll")]
public static extern bool retFalse(int num);
[STAThread]
static void Main(string[] args)
{
for (int i=0; i<5; i++)
{
Console.WriteLine(
"IsEven({0}) = {1} \t retFalse({0}) = {2}",
i, IsEven(i), retFalse(i));
}
Console.ReadLine();
}
}
}
=========================
Next, the initial C++ code.
// Starting point:
// http://www.codeproject.com/csharp/UseCDLLlibinCS.asp
#include <stdio.h>
extern "C"
{
__declspec(dllexport) bool IsEven(int somenum)
{
if (somenum == (somenum / 2 * 2))
return(true);
else
return(false);
}
__declspec(dllexport) bool retFalse(int somenum)
{
if (somenum == (somenum / 2 * 2))
return(true);
else
return(false);
}
}
=========================
This is the output.
IsEven(0) = True retFalse(0) = True
IsEven(1) = False retFalse(1) = False
IsEven(2) = True retFalse(2) = True
IsEven(3) = False retFalse(3) = False
IsEven(4) = True retFalse(4) = True
Both "return(true);" and "return(false);" are working.
=========================
This is the code after commenting out everything in retFalse() except
"return(false);"
// Starting point:
// http://www.codeproject.com/csharp/UseCDLLlibinCS.asp
#include <stdio.h>
extern "C"
{
__declspec(dllexport) bool IsEven(int somenum)
{
if (somenum == (somenum / 2 * 2))
return(true);
else
return(false);
}
__declspec(dllexport) bool retFalse(int somenum)
{
/*if (somenum == (somenum / 2 * 2))
return(true);
else */
return(false);
}
}
=========================
This is the output.
IsEven(0) = True retFalse(0) = True
IsEven(1) = False retFalse(1) = True
IsEven(2) = True retFalse(2) = True
IsEven(3) = False retFalse(3) = True
IsEven(4) = True retFalse(4) = True
Why isn't retFalse always False??
=========================
Here is another function showing things I tried that didn't work...
__declspec(dllexport) bool TorF(int num)
{
//return(true);
//return(false);
//return(1 == 0);
//bool ret = false;
//return(ret);
// if(num == (num / 2 * 2)) // IsEven(num)
//return(true);
return(false);
// else
//return(false);
// return(true);
}
=========================
Any suggestions?
Thanks.
-- Mark
This morning I thought I was getting somewhere, successfully getting back
the correct answers to a C++ " int SumArray(int ray[], int count)"
Now I'm having problems with C++ "return(false)" being True in C#.
Here is the C# code.
=========================
using System;
using System.Runtime.InteropServices; //
namespace GUI_03
{
class Class1
{
[DllImport("Test05.dll")]
public static extern bool IsEven(int num);
[DllImport("Test05.dll")]
public static extern bool retFalse(int num);
[STAThread]
static void Main(string[] args)
{
for (int i=0; i<5; i++)
{
Console.WriteLine(
"IsEven({0}) = {1} \t retFalse({0}) = {2}",
i, IsEven(i), retFalse(i));
}
Console.ReadLine();
}
}
}
=========================
Next, the initial C++ code.
// Starting point:
// http://www.codeproject.com/csharp/UseCDLLlibinCS.asp
#include <stdio.h>
extern "C"
{
__declspec(dllexport) bool IsEven(int somenum)
{
if (somenum == (somenum / 2 * 2))
return(true);
else
return(false);
}
__declspec(dllexport) bool retFalse(int somenum)
{
if (somenum == (somenum / 2 * 2))
return(true);
else
return(false);
}
}
=========================
This is the output.
IsEven(0) = True retFalse(0) = True
IsEven(1) = False retFalse(1) = False
IsEven(2) = True retFalse(2) = True
IsEven(3) = False retFalse(3) = False
IsEven(4) = True retFalse(4) = True
Both "return(true);" and "return(false);" are working.
=========================
This is the code after commenting out everything in retFalse() except
"return(false);"
// Starting point:
// http://www.codeproject.com/csharp/UseCDLLlibinCS.asp
#include <stdio.h>
extern "C"
{
__declspec(dllexport) bool IsEven(int somenum)
{
if (somenum == (somenum / 2 * 2))
return(true);
else
return(false);
}
__declspec(dllexport) bool retFalse(int somenum)
{
/*if (somenum == (somenum / 2 * 2))
return(true);
else */
return(false);
}
}
=========================
This is the output.
IsEven(0) = True retFalse(0) = True
IsEven(1) = False retFalse(1) = True
IsEven(2) = True retFalse(2) = True
IsEven(3) = False retFalse(3) = True
IsEven(4) = True retFalse(4) = True
Why isn't retFalse always False??
=========================
Here is another function showing things I tried that didn't work...
__declspec(dllexport) bool TorF(int num)
{
//return(true);
//return(false);
//return(1 == 0);
//bool ret = false;
//return(ret);
// if(num == (num / 2 * 2)) // IsEven(num)
//return(true);
return(false);
// else
//return(false);
// return(true);
}
=========================
Any suggestions?
Thanks.
-- Mark