在C++中有程序写好一个一个软件,但是现在需要用 C# 实现,我学java的, C# 会一点点, 有C++ 的源码, 如何改写成C# 实现, 谢谢 了, 下面是 C++ 源码::
/********************************************************************Copyright (c) Dr.Xiao
All rights reserved.
created: 2010/04/16
version: v1.0.0.0
说明: Demo For Test DLL OF Portable Printer(RS232)
revision: *********************************************************************/
/*************************2010-04-18 Update****************************************/
/*
SetMagnify change to SetMagnify(char mode);
*/
// PPrinterDemoDlg.cpp : 实现文件
//#include "stdafx.h"
#include "PPrinterDemo.h"
#include "PPrinterDemoDlg.h"
#include "DllDefine.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
typedef int (* OpenPrinter) ();
typedef int (* ClosePrinter) ();
typedef int (*PrintData) (const char * Data,unsigned int Len,int iIfOpen);
typedef int (*UPrintData) (unsigned char * Data,unsigned int Len,int iIfOpen);
typedef int (* PrintBlankLine)(UINT nBlankLine);
typedef int (*SetRowSpacing) (UINT nRowSpacing);
typedef int (*SetAlign) (AlignMode_t mode);
typedef int (*SetMagnify) (char mode);
typedef int (*PrintBMP) (unsigned char * Data,int Width,int Length,int mode);
// CPPrinterDemoDlg 对话框
#define FILEHEADSIZE 0x436
#define FILEHEADSIZE1 0x3e
static unsigned char headdata[FILEHEADSIZE1]={
0x42, 0x4d, 0x8a, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x28, 0x00,
0x00, 0x00, 0xa0, 0x01, 0x00, 0x00, 0x9f, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x4c, 0x54, 0x00, 0x00, 0xc4, 0x0e, 0x00, 0x00, 0xc4, 0x0e, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00
};
char filename[]="\\b1.bmp";
//char filename[]="\\b2.bmp";
char bakfilename[]="\\a1.bmp";
CPPrinterDemoDlg::CPPrinterDemoDlg(CWnd* pParent /*=NULL*/)
: CDialog(CPPrinterDemoDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}void CPPrinterDemoDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CPPrinterDemoDlg, CDialog)
#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
ON_WM_SIZE()
#endif
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_PRINT, &CPPrinterDemoDlg::OnBnClickedPrint)
ON_BN_CLICKED(IDC_FONT, &CPPrinterDemoDlg::OnBnClickedFont)
ON_BN_CLICKED(IDC_FONT2, &CPPrinterDemoDlg::OnBnClickedFont2)
ON_BN_CLICKED(IDC_FONT3, &CPPrinterDemoDlg::OnBnClickedFont3)
ON_BN_CLICKED(IDC_FONT4, &CPPrinterDemoDlg::OnBnClickedFont4)
ON_BN_CLICKED(IDC_PRINT_BMP, &CPPrinterDemoDlg::OnBnClickedPrintBmp)
END_MESSAGE_MAP()
// CPPrinterDemoDlg 消息处理程序BOOL CPPrinterDemoDlg::OnInitDialog()
{
CDialog::OnInitDialog(); // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 hDllLib = LoadLibrary(_T("PPrinter.dll"));
if (NULL == hDllLib){ AfxMessageBox ( L"Load DLL Error!" ); }
OpenPrinter pfnOpenPrinter;
pfnOpenPrinter = (OpenPrinter) GetProcAddress(hDllLib, L"OpenPrinter");
int m;
m=(*pfnOpenPrinter)();
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
void CPPrinterDemoDlg::OnSize(UINT /*nType*/, int /*cx*/, int /*cy*/)
{
if (AfxIsDRAEnabled())
{
DRA::RelayoutDialog(
AfxGetResourceHandle(),
this->m_hWnd,
DRA::GetDisplayMode() != DRA::Portrait ?
MAKEINTRESOURCE(IDD_PPRINTERDEMO_DIALOG_WIDE) :
MAKEINTRESOURCE(IDD_PPRINTERDEMO_DIALOG));
}
}
#endifvoid CPPrinterDemoDlg::ExitWnd()
{ ClosePrinter pfnClosePrinter;
pfnClosePrinter = (ClosePrinter) GetProcAddress(hDllLib, L"ClosePrinter");
int m;
m=(*pfnClosePrinter)();
FreeLibrary(hDllLib);}
void CPPrinterDemoDlg::OnBnClickedPrint()
{
// TODO: Add your control notification handler code here
}void CPPrinterDemoDlg::OnBnClickedFont()
{
// TODO: Add your control notification handler code here
}void CPPrinterDemoDlg::OnBnClickedFont2()
{
// TODO: Add your control notification handler code here
}void CPPrinterDemoDlg::OnBnClickedFont3()
{
// TODO: Add your control notification handler code here
}void CPPrinterDemoDlg::OnBnClickedFont4()
{
// TODO: Add your control notification handler code here
}
void CPPrinterDemoDlg::OnBnClickedPrintBmp()
{
// TODO: Add your control notification handler code here int width, length;
int data_len;
int i,j; unsigned char data[12800];
unsigned char BMPdata[12800] ; PrintData pfnPrintData;
pfnPrintData = (PrintData) GetProcAddress(hDllLib, L"PrintData");
UPrintData pfnUPrintData;
pfnUPrintData = (UPrintData) GetProcAddress(hDllLib, L"UPrintData");
PrintBlankLine pfnPrintBlankLine;
pfnPrintBlankLine = (PrintBlankLine) GetProcAddress(hDllLib, L"PrintBlankLine");
SetRowSpacing pfnSetRowSpacing;
pfnSetRowSpacing = (SetRowSpacing) GetProcAddress(hDllLib, L"SetRowSpacing");
SetAlign pfnSetAlign;
pfnSetAlign = (SetAlign) GetProcAddress(hDllLib, L"SetAlign");
SetMagnify pfnSetMagnify;
pfnSetMagnify = (SetMagnify) GetProcAddress(hDllLib, L"SetMagnify");
PrintBMP pfnPrintBMP;
pfnPrintBMP = (PrintBMP) GetProcAddress(hDllLib, L"PrintBMP");
int m; m=(*pfnSetAlign)(AlignLeft); ReadDataFromBMPFile(filename,data, &width, &length);
data_len=width*length/8; for(m=0;m<data_len;m++) {
data[m]=0xff-data[m];
}
for(i=0;i<length;i++) {
for(j=0;j<width/8;j++)
BMPdata[i*width/8+j]=data[(length-i-1)*width/8+j];
}
m=(*pfnPrintBMP)(BMPdata,width/8,length,0);}
void CPPrinterDemoDlg::ReadDataFromBMPFile(char * filename,unsigned char * data, int* width,int* length)
{
unsigned char BMPheaddata[FILEHEADSIZE1];
int len; stream=fopen(filename,"r+b");
fread(&BMPheaddata[0],sizeof(unsigned char),FILEHEADSIZE1,stream); *length=BMPheaddata[0x16]+BMPheaddata[0x17]*0x100;
*width=BMPheaddata[0x12]+BMPheaddata[0x13]*0x100; len=(*length)*(*width);
len=len/8;
fread(data,sizeof(unsigned char),len,stream);
fclose(stream);}
void CPPrinterDemoDlg::WriteDataToBMPFile(char * filename,unsigned char * data, int length,int width)
{}
主要是改写加粗了变红的的那两个方法, 谢谢 了,
/********************************************************************Copyright (c) Dr.Xiao
All rights reserved.
created: 2010/04/16
version: v1.0.0.0
说明: Demo For Test DLL OF Portable Printer(RS232)
revision: *********************************************************************/
/*************************2010-04-18 Update****************************************/
/*
SetMagnify change to SetMagnify(char mode);
*/
// PPrinterDemoDlg.cpp : 实现文件
//#include "stdafx.h"
#include "PPrinterDemo.h"
#include "PPrinterDemoDlg.h"
#include "DllDefine.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
typedef int (* OpenPrinter) ();
typedef int (* ClosePrinter) ();
typedef int (*PrintData) (const char * Data,unsigned int Len,int iIfOpen);
typedef int (*UPrintData) (unsigned char * Data,unsigned int Len,int iIfOpen);
typedef int (* PrintBlankLine)(UINT nBlankLine);
typedef int (*SetRowSpacing) (UINT nRowSpacing);
typedef int (*SetAlign) (AlignMode_t mode);
typedef int (*SetMagnify) (char mode);
typedef int (*PrintBMP) (unsigned char * Data,int Width,int Length,int mode);
// CPPrinterDemoDlg 对话框
#define FILEHEADSIZE 0x436
#define FILEHEADSIZE1 0x3e
static unsigned char headdata[FILEHEADSIZE1]={
0x42, 0x4d, 0x8a, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x28, 0x00,
0x00, 0x00, 0xa0, 0x01, 0x00, 0x00, 0x9f, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x4c, 0x54, 0x00, 0x00, 0xc4, 0x0e, 0x00, 0x00, 0xc4, 0x0e, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00
};
char filename[]="\\b1.bmp";
//char filename[]="\\b2.bmp";
char bakfilename[]="\\a1.bmp";
CPPrinterDemoDlg::CPPrinterDemoDlg(CWnd* pParent /*=NULL*/)
: CDialog(CPPrinterDemoDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}void CPPrinterDemoDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CPPrinterDemoDlg, CDialog)
#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
ON_WM_SIZE()
#endif
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_PRINT, &CPPrinterDemoDlg::OnBnClickedPrint)
ON_BN_CLICKED(IDC_FONT, &CPPrinterDemoDlg::OnBnClickedFont)
ON_BN_CLICKED(IDC_FONT2, &CPPrinterDemoDlg::OnBnClickedFont2)
ON_BN_CLICKED(IDC_FONT3, &CPPrinterDemoDlg::OnBnClickedFont3)
ON_BN_CLICKED(IDC_FONT4, &CPPrinterDemoDlg::OnBnClickedFont4)
ON_BN_CLICKED(IDC_PRINT_BMP, &CPPrinterDemoDlg::OnBnClickedPrintBmp)
END_MESSAGE_MAP()
// CPPrinterDemoDlg 消息处理程序BOOL CPPrinterDemoDlg::OnInitDialog()
{
CDialog::OnInitDialog(); // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 hDllLib = LoadLibrary(_T("PPrinter.dll"));
if (NULL == hDllLib){ AfxMessageBox ( L"Load DLL Error!" ); }
OpenPrinter pfnOpenPrinter;
pfnOpenPrinter = (OpenPrinter) GetProcAddress(hDllLib, L"OpenPrinter");
int m;
m=(*pfnOpenPrinter)();
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
void CPPrinterDemoDlg::OnSize(UINT /*nType*/, int /*cx*/, int /*cy*/)
{
if (AfxIsDRAEnabled())
{
DRA::RelayoutDialog(
AfxGetResourceHandle(),
this->m_hWnd,
DRA::GetDisplayMode() != DRA::Portrait ?
MAKEINTRESOURCE(IDD_PPRINTERDEMO_DIALOG_WIDE) :
MAKEINTRESOURCE(IDD_PPRINTERDEMO_DIALOG));
}
}
#endifvoid CPPrinterDemoDlg::ExitWnd()
{ ClosePrinter pfnClosePrinter;
pfnClosePrinter = (ClosePrinter) GetProcAddress(hDllLib, L"ClosePrinter");
int m;
m=(*pfnClosePrinter)();
FreeLibrary(hDllLib);}
void CPPrinterDemoDlg::OnBnClickedPrint()
{
// TODO: Add your control notification handler code here
}void CPPrinterDemoDlg::OnBnClickedFont()
{
// TODO: Add your control notification handler code here
}void CPPrinterDemoDlg::OnBnClickedFont2()
{
// TODO: Add your control notification handler code here
}void CPPrinterDemoDlg::OnBnClickedFont3()
{
// TODO: Add your control notification handler code here
}void CPPrinterDemoDlg::OnBnClickedFont4()
{
// TODO: Add your control notification handler code here
}
void CPPrinterDemoDlg::OnBnClickedPrintBmp()
{
// TODO: Add your control notification handler code here int width, length;
int data_len;
int i,j; unsigned char data[12800];
unsigned char BMPdata[12800] ; PrintData pfnPrintData;
pfnPrintData = (PrintData) GetProcAddress(hDllLib, L"PrintData");
UPrintData pfnUPrintData;
pfnUPrintData = (UPrintData) GetProcAddress(hDllLib, L"UPrintData");
PrintBlankLine pfnPrintBlankLine;
pfnPrintBlankLine = (PrintBlankLine) GetProcAddress(hDllLib, L"PrintBlankLine");
SetRowSpacing pfnSetRowSpacing;
pfnSetRowSpacing = (SetRowSpacing) GetProcAddress(hDllLib, L"SetRowSpacing");
SetAlign pfnSetAlign;
pfnSetAlign = (SetAlign) GetProcAddress(hDllLib, L"SetAlign");
SetMagnify pfnSetMagnify;
pfnSetMagnify = (SetMagnify) GetProcAddress(hDllLib, L"SetMagnify");
PrintBMP pfnPrintBMP;
pfnPrintBMP = (PrintBMP) GetProcAddress(hDllLib, L"PrintBMP");
int m; m=(*pfnSetAlign)(AlignLeft); ReadDataFromBMPFile(filename,data, &width, &length);
data_len=width*length/8; for(m=0;m<data_len;m++) {
data[m]=0xff-data[m];
}
for(i=0;i<length;i++) {
for(j=0;j<width/8;j++)
BMPdata[i*width/8+j]=data[(length-i-1)*width/8+j];
}
m=(*pfnPrintBMP)(BMPdata,width/8,length,0);}
void CPPrinterDemoDlg::ReadDataFromBMPFile(char * filename,unsigned char * data, int* width,int* length)
{
unsigned char BMPheaddata[FILEHEADSIZE1];
int len; stream=fopen(filename,"r+b");
fread(&BMPheaddata[0],sizeof(unsigned char),FILEHEADSIZE1,stream); *length=BMPheaddata[0x16]+BMPheaddata[0x17]*0x100;
*width=BMPheaddata[0x12]+BMPheaddata[0x13]*0x100; len=(*length)*(*width);
len=len/8;
fread(data,sizeof(unsigned char),len,stream);
fclose(stream);}
void CPPrinterDemoDlg::WriteDataToBMPFile(char * filename,unsigned char * data, int length,int width)
{}
主要是改写加粗了变红的的那两个方法, 谢谢 了,
解决方案 »
- 数组元素相同和不同个数统计咋实现
- VisualStudio的ClassDiagram不能同步更新吗?
- 请教:关于文件的分段读写,路过的高人指点迷津
- FtpWebRequest不能上传文件名带“#”的文件到FTP服务器,如何处理?
- 如何使我的winform程序一直使用某种特定的系统主题风格?
- 为什么不显示数据啊 ?????????
- 触摸式的一体查询机或者是排队机一般都是用什么模式开发的BS还是CS
- 索引超出范围。必须为非负值并小于集合大小。
- C#開發WinForm程序,處於中斷模式時,為什麼不能打開Excel檔???是軟微bug嗎?
- 应用程序不能在其他机子上使用??
- C# 启动新实例调试 无法直接启动带有“类库输出类型”的项目,急
- new SqlParameter指定类型和不指定类型区别
再进行net映射,然后在net这边就可以使用了
如果可能的话,这个程序怎么打包啊成.dll方法, ,我C# 直接调用,
或者说,C++如何处理这个程序,我的C# 直接能调用。 ,谢谢。
typedef int (*PrintData) (const char * Data,unsigned int Len,int iIfOpen);
PrintData pfnPrintData;
pfnPrintData = (PrintData) GetProcAddress(hDllLib, L"PrintData");
这段代码在C#里面就可以改成
[DllImport("PPrinter.dll",EntryPoint="PrintData")]
public static extern int PrintData(byte[] data,int len,int iIfopen)
剩下的就是数据的转换了。至于第二个函数,如果你的程序读取的标准的bmp图片,第二个函数自己重写一下,就行。
也就几句话的事情。定义bitmap对象,打开图片,读取宽和高,把数据保存到一个二进制数组就行了。
不过记得要把bmp的头去掉,才是你要的数据。
请问,我如何去掉我图片的bmp的头像啊,
[DllImport("PPrinter.dll", EntryPoint = "PrintBMP", SetLastError = true)]
public static extern int PrintBMP(byte[] data, int nwidth, int nheigth, int nmode);
public void test()
{
string strFileName = ".......";
Bitmap b = new Bitmap(strFileName);
MemoryStream ms = new MemoryStream();
// Save to memory using the Jpeg format
b.Save(ms, ImageFormat.Bmp); // read to end
byte[] bmpBytes = ms.GetBuffer();
int width = b.Width;
int length = b.Height;
b.Dispose();
ms.Close(); byte[] data = new byte[12800];
byte[] BMPdata = new byte[12800] ; Buffer.BlockCopy(bmpBytes, 0, data, 0, bmpBytes.Length); int data_len = width * length / 8; for (int m = 0; m < data_len; m++)
{
data[m] = (byte)(0xff - data[m]);
}
for (int i = 0; i < length; i++)
{
for (int j = 0; j < width / 8; j++)
BMPdata[i * width / 8 + j] = data[(length - i - 1) * width / 8 + j];
} int nResult = PrintBMP(BMPdata, width, length, 0);
}
就是这个:#define FILEHEADSIZE1 0x3e
看来你都没有看那个C++的代码呀。
void CPPrinterDemoDlg::ReadDataFromBMPFile(char * filename,unsigned char * data, int* width,int* length)
{
//定义bmp图片文件头大小的数组
unsigned char BMPheaddata[FILEHEADSIZE1];
int len;
//打开文件
stream=fopen(filename,"r+b");
//读取bmp文件头
fread(&BMPheaddata[0],sizeof(unsigned char),FILEHEADSIZE1,stream);
//bmp文件头包含了图排尿的长度和宽度
//获取图片的长度
*length=BMPheaddata[0x16]+BMPheaddata[0x17]*0x100;
//获取图片的宽度
*width=BMPheaddata[0x12]+BMPheaddata[0x13]*0x100;
//计算实际图片数据的大小
len=(*length)*(*width);
len=len/8;
//读取实际图片数据
fread(data,sizeof(unsigned char),len,stream);
fclose(stream);}