手头有一个PCI通讯板卡。有DLL驱动。测试DEMO原来是VC环境下。现在要改成c#环境。这里面涉及到C#如何调用原来DLL的API函数问题。任务单一:就是把原来的VC环境的demo程序用C#写。下面是VC环境的DEMO程序。<br />// Test_pcitio.cpp<br />//<br />// Generated by DriverWizard version DriverStudio 2.7.0 (Build 562)<br />//<br />// This console application demonstrates how to open a handle<br />// to a device in your driver, and communicate with the driver<br />// using Read, Write, and DeviceIoControl calls, as appropriate.<br />//<br />// This test program attempts to open the device using the<br />// GUID defined in "..PcitioDeviceinterface.h"<br /><br />#include <stdlib.h><br />#include <stdio.h><br />#include <windows.h><br /><br /><br />#include <winioctl.h><br />#include "..pcitioioctl.h"<br /><br />#include "..PcitioDeviceinterface.h" // Has class GUID definition<br /><br /><br /><br /><br />// This function is found in module OpenByIntf.cpp<br />HANDLE OpenByInterface(GUID* pClassGuid, DWORD instance, PDWORD pError);<br /><br />typedef void VOIDFUNC();<br /><br />HANDLE h,IOWaiter, hEvent;<br />// Prototypes<br />void Usage(void);<br />void ShowIoctlValues(void);<br /><br />// TODO:<br />// You can redefine the IOCTL handler prototypes as needed, adding<br />// appropriate parameters that can be collected from the command line.<br />// To do this you must modify the command line parsing logic. An<br />// example of this is shown in comments throughout the test application.<br />//<br />//=== Parameterized IOCTL Example ===<br />// void Test_IOCTL_PARAMETERIZED(int nVal, ULONG dwVal);<br />//void Test_PCITIO_IOCTL_DMAHEADADD(ULONG mode);<br />//ULONG Test_PCITIO_IOCTL_INTCSR(ULONG seldelay,ULONG selstart,ULONG selend,ULONG selindex,ULONG done);<br />ULONG Test_PCITIO_IOCTL_DMABYTES(ULONG add,ULONG data);<br />void Test_PCITIO_IOCTL_DMAREAD(void);<br />void Test_PCITIO_IOCTL_DMAWRITE(void);<br />/*ULONG startout(ULONG delaynum,ULONG startaddress,<br /> ULONG endaddress,ULONG indexaddress<br /> ,ULONG channelnum);<br /> */<br />//void writesize(ULONG x,ULONG y);<br />//void writebuf(ULONG address,BYTE data);<br /><br />void CloseIfOpen(void);<br /><br /><br />// Global data<br />void ReadOne();<br />void WriteOne();<br />void Read();<br />void Write();<br /><br /> long i = 0;<br /> int tp =0;<br /> ULONG *wrbuf;<br /> BYTE *wrrbuf;<br /> BYTE *ttfbuf;<br /> ULONG *wrfilebuf;<br /> BYTE *membuf;<br /> long start=0;<br /> long kk=0;<br /> ULONG chang,kuan;<br /><br /> //全局缓冲区,就是你们应用程序的内存缓冲区<br /> //现申请大小512M字节,可以修改大小<br /><br />#define N_IOCODES 6<br /><br />// Names of IOCTL codes<br />//<br />char *IOnames[N_IOCODES+1] =<br />{<br /><br />//=== Parameterized IOCTL Example ===<br />// "IOCTL_PARAMETERIZED",<br /> "PCITIO_IOCTL_DMAHEADADD",<br /> "PCITIO_IOCTL_INTCSR",<br /> "PCITIO_IOCTL_DMABYTES",<br /> "PCITIO_IOCTL_SETEVENT",<br /> "PCITIO_IOCTL_DMAREAD",<br /> "PCITIO_IOCTL_DMAWRITE",<br /> ""<br />};<br /><br />// IOCTL codes<br />//<br />int IOcodes[N_IOCODES+1] =<br />{<br /><br />//=== Parameterized IOCTL Example ===<br />// IOCTL_PARAMETERIZED,<br /> PCITIO_IOCTL_DMAHEADADD,<br /> PCITIO_IOCTL_INTCSR,<br /> PCITIO_IOCTL_DMABYTES,<br /> PCITIO_IOCTL_SETEVENT,<br /> PCITIO_IOCTL_DMAREAD,<br /> PCITIO_IOCTL_DMAWRITE,<br /> 0<br />};<br /><br /><br />// Handle to device opened in driver.<br />//<br />HANDLE hDevice = INVALID_HANDLE_VALUE;<br /><br />// Class GUID used to open device<br />//<br />GUID ClassGuid = PcitioDevice_CLASS_GUID;<br /><br /><br /><br />//dll function declare start<br />typedef BOOL (/*_stdcall*/ *TDMAHEADADD)(ULONG mode);//void Test_PCITIO_IOCTL_DMAHEADADD(ULONG mode)<br />TDMAHEADADD DmaAdd;<br /><br />typedef ULONG (*TDMABYTES)(ULONG add,ULONG data);//ULONG Test_PCITIO_IOCTL_DMABYTES(ULONG add,ULONG data)<br />TDMABYTES DmaBytes;<br /><br />typedef ULONG (*TIOCTLINTCSR)(ULONG seldelay,ULONG selstart,ULONG selend,ULONG selindex,ULONG done);<br />TIOCTLINTCSR TestPciIntCSR;<br /><br />typedef ULONG (*PStartout)(ULONG delaynum,ULONG startaddress,<br /> ULONG endaddress,ULONG indexaddress<br /> ,ULONG channelnum);<br />PStartout startout1;<br /><br />typedef void (*PWriteSize)(ULONG x,ULONG y);<br />PWriteSize writesize;<br /><br />typedef ULONG (*PWriteBuf)(ULONG address,BYTE data);<br />PWriteBuf writebuf;<br /><br />typedef ULONG (*PTransData)(ULONG channelnum);<br />PTransData Transdata;<br /><br /><br />///dll end <br />////////////////////////////////////////////////////////////////////////<br />// Exit<br />//<br />// Print a message and exit<br />//<br /> void Exit(int res)<br />{<br /> printf("Exiting...
");<br />// CloseIfOpen();//like<br /> CloseHandle(hDevice);<br /> CloseHandle(IOWaiter);<br /> exit(res);<br />}<br /><br /><br />////////////////////////////////////////////////////////////////////////<br />// Main entry point<br />//<br />//<br /><br /><br />int __cdecl main(int argc, char *argv[])<br />{<br /> int nArgIncrement = 0;<br /> int jk=0;<br /> ULONG delaynum;<br /> ULONG startaddress;<br /> ULONG endaddress;<br /> ULONG indexaddress;<br /> ULONG channelnum;<br /> ULONG rp=0;<br /> char line[256];<br />//=== Parameterized IOCTL Example ===<br />// int nVal;<br />// ULONG dwVal;<br /> long i;<br /><br /> printf("Test application Test_pcitio starting...
");<br /><br /> printf("input delaynumber (hex16 : 0 to 40):
");<br /> fgets(line, sizeof(line), stdin);<br /> sscanf (line, "%lx",&delaynum);<br /> printf("delay num is %lx
",delaynum);<br /><br /> printf("input startnum (hex16 : 0 to 10000):
");<br /> fgets(line, sizeof(line), stdin);<br /> sscanf (line, "%lx",&startaddress);<br /> printf("start num is %lx
",startaddress);<br /> <br /> printf("input endnumber (hex16 : 0 to 1e400):
");<br /> fgets(line, sizeof(line), stdin);<br /> sscanf (line, "%lx",&endaddress);<br /> printf("end num is %lx
",endaddress);<br /><br /> printf("input indexnumber (hex16 : 0 to ffff):
");<br /> fgets(line, sizeof(line), stdin);<br /> sscanf (line, "%lx",&indexaddress);<br /> printf("delay num is %lx
",indexaddress);<br /><br /> printf("input channelnumber (hex16 : 0 to 2):
");<br /> printf("0 : 32, 1 : 48,2 : 64 :
");<br /> fgets(line, sizeof(line), stdin);<br /> sscanf (line, "%lx",&channelnum);<br /> printf("delay num is %lx
",channelnum);<br />/// 加载dll库<br /> HINSTANCE hInst;<br /> hInst=LoadLibrary("DllDevelop.dll");<br /> DmaAdd=(TDMAHEADADD)GetProcAddress(hInst,"Test_PCITIO_IOCTL_DMAHEADADD");<br /> DmaBytes=(TDMABYTES)GetProcAddress(hInst,"Test_PCITIO_IOCTL_DMABYTES");<br /> startout1=(PStartout)GetProcAddress(hInst,"startout");<br /> writesize=(PWriteSize)GetProcAddress(hInst,"writesize");<br /> writebuf=(PWriteBuf)GetProcAddress(hInst,"writebuf");<br /> Transdata=(PTransData)GetProcAddress(hInst,"Transdata");<br /><br /> //以下为模拟应用程序操作,将文件全部信息,包含头内容<br />//填入缓冲区<br /><br /> HANDLE hFile2 = NULL;<br /> if (hFile2==NULL)<br /> {<br /> hFile2 = CreateFile("TIFF26.BMP", // open MYFILE.TXT <br /> GENERIC_READ, // open for reading <br /> 0, // share for reading <br /> NULL, // no security <br /> OPEN_EXISTING, // existing file only <br /> FILE_ATTRIBUTE_NORMAL, // normal file <br /> NULL); // no attr. template <br /> } <br /><br />//取得文件大小<br /> ULONG *filelengthhigh=0;<br /> ULONG filelength=GetFileSize(hFile2,filelengthhigh);<br /> printf("file length is %ld
",filelength);<br /><br /> ttfbuf = (BYTE *) malloc(2048*1024);<br /> if (ttfbuf == NULL)<br /> {<br /> printf("Failed to allocate buffer for read");<br /> Exit(1);<br /> }<br /><br /> ReadFile(hFile2,ttfbuf,0x3e, &rp, NULL);<br /><br />// 需告诉长宽<br /> for (i=0;i<=0x3d;i++)<br /> {<br /> printf("%x",ttfbuf);<br /> }<br /> ULONG kuany = (ttfbuf[0x19]<<24)+(ttfbuf[0x18]<<16)+(ttfbuf[0x17]<<8)+ttfbuf[0x16];<br /> printf("
kuan is %ld
",kuany);<br /><br /> ULONG changx = (ttfbuf[0x15]<<24)+(ttfbuf[0x14]<<16)+(ttfbuf[0x13]<<8)+ttfbuf[0x12];<br /> printf("chang is %ld
",changx);<br /><br /> writesize(changx,kuany);<br /><br /> ULONG dth=((filelength-0x3e)/(256*1024));<br /> ULONG dtp=(filelength-0x3e)-(dth*256*1024);<br /> long fg=0;<br /> for (long dr=0;dr<dth;dr++)<br /> {<br /> ReadFile(hFile2,ttfbuf,256*1024, &rp, NULL);<br /> for (fg=(dr*1024*256);fg<((dr+1)*1024*256);fg++)<br /> {<br /> writebuf(fg,ttfbuf[fg-(dr*1024*256)]);<br /> }<br /> }<br /> for (i=0;i<dtp;i++)<br /> {<br /> ReadFile(hFile2,ttfbuf,1, &rp, NULL);<br /> writebuf((fg+i),ttfbuf[0]);<br /> }<br /><br /><br /> //执行数据转换和发送到PCI卡函数<br /> Transdata(channelnum);<br /> //转换完成后开始输出<br /> startout1(delaynum,startaddress,endaddress,indexaddress,channelnum);<br /> // startout(delaynum,startaddress,endaddress,indexaddress,channelnum);<br /> CloseHandle(hFile2);<br /> return 0;<br />}<br /><br />希望北京有谁熟悉,因为可以方便调试验证,时间很紧。希望周六就能搞定(做过的人大约1小时搞定)我的电话:010-80752670<br /> |
|