Hiya!
I've got a question about importing C dlls and using them in C#.
Here are two of the C dll functions:
-----------------------------------------
1) DLL_API short getMessage(unsigned char *msg, unsigned short maxLength)
2) DLL_API short getHitDataSetValue(unsigned char *msg, unsigned short q, float *fVal)
there are other functions in the DLL but they are just void so they work fine.
here is my test code:
-------------------------
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace WindowsApplication1
{
unsafe public partial class Form1 : Form
{
static byte[] messages = new byte[32767];
float v;
public Form1()
{
InitializeComponent();
}
[DllImport("Pacdplv.dll", EntryPoint = "openPCI_DSP")]
public extern static short openPCI_DSP();
[DllImport("Pacdplv.dll", EntryPoint = "closePCI_DSP")]
public extern static short closePCI_DSP();
[DllImport("Pacdplv.dll", EntryPoint = "startTest")]
public extern static short startTest();
[DllImport("Pacdplv.dll", EntryPoint = "stopTest")]
public extern static short stopTest();
[DllImport("Pacdplv.dll", EntryPoint = "poll")]
public extern static short poll();
[DllImport("Pacdplv.dll", EntryPoint = "getMessage")]
public extern static short getMessage(byte* msg, short maxLength);
[DllImport("Pacdplv.dll", EntryPoint = "getHitDataSetValue")]
public extern static short getHitDataSetValue(byte* msg, short q, float* fVal);
private void Form1_Load(object sender, EventArgs e)
{
}
private void startBtn_Click(object sender, EventArgs e)
{
if (openPCI_DSP() == 0)
{
textBox1.Text += "opened";
startTest();
}
else
textBox1.Text += "cannot open";
}
private void stopBtn_Click(object sender, EventArgs e)
{
closePCI_DSP();
textBox1.Text += "\r\n";
textBox1.Text += "close";
}
private void startTestBtn_Click(object sender, EventArgs e)
{
textBox1.Text += "\r\ntest started";
poll();
fixed (byte* p = messages)
{
if (getMessage(p, 32767) == 0)
{
textBox1.Text += p[2];
textBox1.Text += "\r\n";
fixed (float* q = &v){
getHitDataSetValue(p, 16, q);
textBox1.Text += q.ToString();
}
}
}
}
private void stopTestBtn_Click(object sender, EventArgs e)
{
stopTest();
textBox1.Text += "\r\ntest stopped";
}
}
}
----------
i have a sensor which detects vibration connected to a PCM-CIA slot and the DLLs will access the machine. I currently have some problems with my outputs (i touch the sensor and it doesn't pick up anything on my outputs)
My question is: am i using the pointers correctly? I had to replace the "unsigned" parameters with "byte" since C# doesn't take unsigned as a key word. I use byte since it's an unsigned 8-bit character anyways so i think that's ok for my extern function. I have a feeling i'm not passing things correctly.
Any help would be much appreciated! Thanks!
Loading
Sunny ChenPosted Jul 2, 2008, 9:14 PM
Hello. I don't think you are using the pointers correctly.
I have a program and the function definition in C language of the dll is:
But I declared it in C# by:
[DllImport("mydll.dll", EntryPoint="MyFunc", SetLastError=true,CharSet=CharSet.Ansi, ExactSpelling=true,
CallingConvention=CallingConvention.StdCall)]
private static extern int MyFunc(String input, [Out] char[] bc,
[Out] char[] err, Int16 flag, Int16 bid);
If you want to know more about how to invoke dll functions written in C, I give you the link: http://www.pinvoke.net.
Hope this helps!