在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)
{}
 主要是改写加粗了变红的的那两个方法,  谢谢 了, 

解决方案 »

  1.   

    既然”C++中有程序写好一个一个软件“,而且我看了你的OnBnClickedPrintBmp这个处理函数,内容也比较负责,这种情况下,最好有平台调用的方式,调用用C++原来的这个方法。不过,平台调用能调用的API风格的函数,需要你包装一下,把那个函数以API风格导出来,
    再进行net映射,然后在net这边就可以使用了
      

  2.   

    哦,我是将被人调用设备上的接口,然后打印 图片,她们给我的是动态库,这个她们给我的源码,我们需要用c#,可是C# 调用方法,结果不一样,需要把图片处理一下,这个是处理图片的,、
    如果可能的话,这个程序怎么打包啊成.dll方法, ,我C# 直接调用, 
    或者说,C++如何处理这个程序,我的C# 直接能调用。 ,谢谢。   
      

  3.   

    应该不难,你程序里又没有复杂的类型。
    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)
      

  4.   

    第一个函数,就是动态加载了一些dll函数,你采用静态声明就行了。
    剩下的就是数据的转换了。至于第二个函数,如果你的程序读取的标准的bmp图片,第二个函数自己重写一下,就行。
    也就几句话的事情。定义bitmap对象,打开图片,读取宽和高,把数据保存到一个二进制数组就行了。
    不过记得要把bmp的头去掉,才是你要的数据。
      

  5.   


    请问,我如何去掉我图片的bmp的头像啊,
      

  6.   

    没有测试过的,仅供参考//其它函数声明略...
    [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);
            }        
      

  7.   

    你看,你的C++代码里都帮你定义好了。
    就是这个:#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);}