ok6410 AD C++ dll制作并在C#中调用

来源:互联网 发布:风筝pc蛋蛋软件 编辑:程序博客网 时间:2024/06/03 15:41

1.vs.net 2008里面创建smart device project,选择DLL。




2.程序如下:

// 6410ADCDLL.cpp : 定义 DLL 应用程序的入口点。
//
#pragma once


#pragma comment(linker, "/nodefaultlib:libc.lib")
#pragma comment(linker, "/nodefaultlib:libcd.lib")


// 注意 - 这个值与作为目标的 Windows CE OS 版本的关联性并不强
#define WINVER _WIN32_WCE


#include <ceconfig.h>




#include <altcecrt.h>
#include "stdafx.h"
DWORD CTL_CODE(uint DeviceType, uint Function, uint Method, uint Access)
{
            return ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method);
}


       
#define FILE_SHARE_READ  0x00000001
#define FILE_SHARE_WRITE 0x00000002
#define OPEN_EXISTING  3
#define FILE_FLAG_RANDOM_ACCESS  0x10000000
#define FILE_DEVICE_UNKNOWN  0x00000022
#define IOCTL_UNKNOWN_BASE  FILE_DEVICE_UNKNOWN
#define METHOD_BUFFERED  0
#define FILE_ANY_ACCESS 0
#define FILE_READ_ACCESS  0x0001
#define FILE_WRITE_ACCESS 0x0002


#define IOCTL_ADC_START CTL_CODE(FILE_DEVICE_UNKNOWN, 60, METHOD_BUFFERED, FILE_ANY_ACCESS) //60???
#define IOCTL_ADC_STOP  CTL_CODE(FILE_DEVICE_UNKNOWN, 61, METHOD_BUFFERED, FILE_ANY_ACCESS)


HANDLE hAdc;
HANDLE hThread;
HANDLE hAdcEvent;
DWORD WINAPI AdcThread (PVOID);

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
)
{
    return TRUE;
}


extern "C" _declspec(dllexport) BOOL initADC();
BOOL initADC()
{


hAdc = CreateFile(TEXT("ADC1:"),GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
if (hAdc == INVALID_HANDLE_VALUE)
{
//printf ("can't open device\r\n");
return FALSE;
}
else
{
//printf ("Open ADC1\r\n");
//hThread = CreateThread (NULL, 0, AdcThread, NULL, 0, NULL);
return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE

}


//hThread = CreateThread (NULL, 0, AdcThread, NULL, 0, NULL);




}




DWORD WINAPI AdcThread (PVOID hdcMain)
{
DWORD dwBytesRead;
DWORD convalue;
//char tempvalue[3];
//CString str;
//CADC_AppDlg *pdlg =(CADC_AppDlg*)(AfxGetApp()->m_pMainWnd);


hAdcEvent = CreateEvent(NULL, TRUE, FALSE, _T("TE6410_ADC_read"));
while(1)
{
WaitForSingleObject(hAdcEvent, INFINITE);
ReadFile(hAdc, &convalue, sizeof(DWORD), &dwBytesRead, NULL);

//str.Format(_T("%d"),convalue);


//pdlg->SetDlgItemTextW(IDC_EDIT1,str);


//printf("convalue = %d !!!!\n", convalue);
Sleep(2);


}
return convalue;
}




extern "C" _declspec(dllexport) UINT ADCStart();
UINT ADCStart()
{
DWORD dwBytesRead;
DWORD convalue;


DeviceIoControl (hAdc, IOCTL_ADC_START,  NULL, 0, NULL, 0, NULL, NULL);
SetEvent(hAdcEvent);


ReadFile(hAdc, &convalue, sizeof(DWORD), &dwBytesRead, NULL);

//char tempvalue[3];
//CString str;
//CADC_AppDlg *pdlg =(CADC_AppDlg*)(AfxGetApp()->m_pMainWnd);



convalue=convalue+1;
ResetEvent(hAdcEvent);
DeviceIoControl (hAdc, IOCTL_ADC_STOP, 
NULL, 0, 
NULL, 0, NULL, NULL);
return convalue;


//return 1;


}


extern "C" _declspec(dllexport) BOOL ADCStop();
BOOL ADCStop()
{
ResetEvent(hAdcEvent);
DeviceIoControl (hAdc, IOCTL_ADC_STOP, 
NULL, 0, 
NULL, 0, NULL, NULL);
return 1;


编译陈功后有6410ADCDLL.dll文件






3.C#中调用

首先是先添加到工程中,然后添加如下程序

[DllImport("Coredll.dll",  EntryPoint = "CloseHandle",SetLastError = true)]
        static extern int CloseHandle(IntPtr hObject);


        [DllImport("6410ADCDLL.dll", EntryPoint = "initADC", SetLastError = true)]
        static extern bool initADC();


        [DllImport("6410ADCDLL.dll", EntryPoint = "ADCStart", SetLastError = true)]
        static extern uint ADCStart();


        [DllImport("6410ADCDLL.dll", EntryPoint = "ADCStop", SetLastError = true)]
        static extern bool ADCStop();

private void button7_Click(object sender, EventArgs e)
        {
            initADC();
        }


        private void button8_Click(object sender, EventArgs e)
        {
            uint d;
            d=ADCStart();
            d = ADCStart();
            MessageBox.Show(d.ToString());
            d = d + 1;


        }


调试的时候将断点设置到变量d上面就可以看到结果



0 0
原创粉丝点击