源程序如下:需要用C#改写,现在这个程序是C++调用动态链接库shell.dll。多谢各位。#include "stdafx.h"#include <windows.h>#define BASE_ADDR 0x18000000
typedef UINT8* (* ProcAddr_Map)(UINT32 physicalADDR, UINT32 dataLen);typedef UINT8* (* ProcAddr_UnMap)(UINT32 physicalADDR, UINT32 dataLen);typedef UINT32 (* ProcAddr_Read)(UINT8* virtualADDR, UINT32 dataLen, UINT16 *pDataBuf);int _tmain(int argc, _TCHAR* argv[]){
HINSTANCE hinstLib = NULL; hinstLib = LoadLibrary(L"\\windows\\shell.dll"); if(hinstLib == NULL) { printf("failed to load shell.dll\r\n");
return FALSE; } ////////////////////////////////////////////////////////////////获取各功能函数地址 ProcAddr_Map MemoryMap; ProcAddr_UnMap UnMemoryMap; ProcAddr_Read Read;
MemoryMap = (ProcAddr_Map)GetProcAddress(hinstLib, TEXT("MemoryMap")); if (MemoryMap == NULL) { printf("failed to get ReadFPGA function address \r\n"); return FALSE; }
UnMemoryMap = (ProcAddr_UnMap)GetProcAddress(hinstLib, TEXT("UnMemoryMap"));
Read = (ProcAddr_Read)GetProcAddress(hinstLib, TEXT("ReadData16")); UINT8 *pVirtualAddr = NULL; INT nDataLen = 200;
UINT32 physicalADDR =BASE_ADDR; pVirtualAddr = MemoryMap(physicalADDR, nDataLen); UINT16 bufRead[1]; memset(bufRead,1,sizeof(bufRead)); Read(pVirtualAddr, sizeof(bufRead), bufRead); ////////////////////////////////////////////////////////////////动态库释放 UnMemoryMap(physicalADDR, nDataLen); FreeLibrary(hinstLib); return 0;}
C#dll
typedef UINT8* (* ProcAddr_Map)(UINT32 physicalADDR, UINT32 dataLen);typedef UINT8* (* ProcAddr_UnMap)(UINT32 physicalADDR, UINT32 dataLen);typedef UINT32 (* ProcAddr_Read)(UINT8* virtualADDR, UINT32 dataLen, UINT16 *pDataBuf);int _tmain(int argc, _TCHAR* argv[]){
HINSTANCE hinstLib = NULL; hinstLib = LoadLibrary(L"\\windows\\shell.dll"); if(hinstLib == NULL) { printf("failed to load shell.dll\r\n");
return FALSE; } ////////////////////////////////////////////////////////////////获取各功能函数地址 ProcAddr_Map MemoryMap; ProcAddr_UnMap UnMemoryMap; ProcAddr_Read Read;
MemoryMap = (ProcAddr_Map)GetProcAddress(hinstLib, TEXT("MemoryMap")); if (MemoryMap == NULL) { printf("failed to get ReadFPGA function address \r\n"); return FALSE; }
UnMemoryMap = (ProcAddr_UnMap)GetProcAddress(hinstLib, TEXT("UnMemoryMap"));
Read = (ProcAddr_Read)GetProcAddress(hinstLib, TEXT("ReadData16")); UINT8 *pVirtualAddr = NULL; INT nDataLen = 200;
UINT32 physicalADDR =BASE_ADDR; pVirtualAddr = MemoryMap(physicalADDR, nDataLen); UINT16 bufRead[1]; memset(bufRead,1,sizeof(bufRead)); Read(pVirtualAddr, sizeof(bufRead), bufRead); ////////////////////////////////////////////////////////////////动态库释放 UnMemoryMap(physicalADDR, nDataLen); FreeLibrary(hinstLib); return 0;}
C#dll
class Program
{
static void Main()
{
const uint BASE_ADDR = 0x18000000;
uint dataLen = 200;
uint physicalAddr = BASE_ADDR; IntPtr pVirtualAddr = MemoryMap(physicalAddr, dataLen);
ushort[] buffer = new ushort[1] { 1 };
ReadData16(pVirtualAddr, (uint)buffer.Length, buffer);
UnMemoryMap(physicalAddr, dataLen);
}
const string shell = "c:\\windows\\shell.dll";
[DllImport(shell)]
static extern IntPtr MemoryMap(uint physicalAddr, uint dataLen);
static extern IntPtr UnMemoryMap(uint physicalAddr, uint dataLen);
static extern uint ReadData16(IntPtr virtualAddr, uint dataLen, ushort[] buffer);
}
[DllImport(shell)]
static extern IntPtr MemoryMap(uint physicalAddr, uint dataLen); [DllImport(shell)]
static extern IntPtr UnMemoryMap(uint physicalAddr, uint dataLen); [DllImport(shell)]
static extern uint ReadData16(IntPtr virtualAddr, uint dataLen, ushort[] buffer);