我的邮箱是[email protected],欢迎讨论,谢谢!

解决方案 »

  1.   

    看Dll的接口是什么,可以把图象的二进制数据流传给Dll.
      

  2.   

    我可以显示图片,但是总有一个异常,xxx地址不能写,查不到原因!
    谁有例子?
      

  3.   

    接口函数使用byte数组作为参数。
      

  4.   

    提供一个接口供VC访问TImage控件的Canvas.Handle属性,即HDC,这样就可以了!
      

  5.   

    道理跟调用WinAPI一样,比如:
        TextOut(hDC, 0, 0, 'Hello World!', 12);
      

  6.   

    问题:图片可以显示,但总是有异常窗口,图片和程序在附件中,我已经在VC中调试了,但是找不到问题点,请问如何解决,谢谢!我想用VC的DLL控制DELPHI image控件的显示,代码如下:
    // Image.h: interface for the CImage class.
    //
    //////////////////////////////////////////////////////////////////////#if !defined(AFX_IMAGE_H__E319F2F9_2FCA_4A60_AADC_36C399F4D6E9__INCLUDED_)
    #define AFX_IMAGE_H__E319F2F9_2FCA_4A60_AADC_36C399F4D6E9__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000class CImage
    {
    private:
            BYTE*                   m_pBitsInfo;
            LPBITMAPFILEHEADER      m_pBFI;
            unsigned long           m_iFileLength;
            unsigned long           m_BytesPerLine;
    public:
            int                     m_iPaletteEntry;
            BYTE*                   m_pImageData;
    public:
            BOOL SaveImage(LPCTSTR filename);
            CImage& operator=(CImage &img);
            int GetDispWidth();
            int GetDispHeight();
            unsigned GetGrayData(int x, int y);
            COLORREF GetColorData(int x, int y);
            void Empty();
            void Display(int x,int y,int cx,int cy,CDC* pDC);
            void Display(int x,int y,CDC *pDC);
            BOOL LoadImage(LPCTSTR filename);
            CImage();
            ~CImage();
    };
    #endif // !defined(AFX_IMAGE_H__E319F2F9_2FCA_4A60_AADC_36C399F4D6E9__INCLUDED_)
    // Image.cpp: implementation of the CImage class.
    //
    //////////////////////////////////////////////////////////////////////#include "stdafx.h"
    #include "Image.h"
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endifCImage::CImage()
    {
            m_pBFI                  = NULL;
            m_pImageData   = NULL;
            m_pBitsInfo             = NULL;}
    CImage::~CImage()
    {
            if(m_pBitsInfo)
                    delete[] m_pBitsInfo;
            if(m_pBFI)
                    delete   m_pBFI;
            m_pBFI          = NULL;
            m_pImageData    = NULL;
            m_pBitsInfo     = NULL;
    }
    BOOL CImage::LoadImage(LPCTSTR filename)
    {
            Empty();
            CFile file;
            BOOL result  = file.Open(filename,CFile::modeRead,NULL);
            if(!result)
            {
                    return result;
            }
            
            file.Seek(0L,CFile::begin);
            m_iFileLength = file.GetLength();
            m_pBFI = (BITMAPFILEHEADER *)new BYTE[sizeof(BITMAPFILEHEADER)];
            if( file.Read(m_pBFI,sizeof(BITMAPFILEHEADER)) != sizeof(BITMAPFILEHEADER))        {
                    return FALSE;
            }
            if( m_pBFI->bfType != 'MB')
            {
                    return FALSE;
            }
            unsigned long lLength = m_iFileLength - sizeof(BITMAPFILEHEADER);
            m_pBitsInfo = new BYTE[lLength];
            if(file.ReadHuge(m_pBitsInfo,lLength) != lLength)
            {
                    return FALSE;
            }
            
            LPBITMAPINFOHEADER pInfo = (BITMAPINFOHEADER *)m_pBitsInfo;
            switch(pInfo->biBitCount)
            {
            case 8:
                    m_iPaletteEntry = 256;
                    break;
            case 24:
                    m_iPaletteEntry = 0;
                    break;
            default:
                    ::AfxMessageBox("This is not an 8-bit or 24-bit bitmap!\n");
                    return FALSE;
            }
            
            m_BytesPerLine=pInfo->biWidth*(pInfo->biBitCount/8);
            if(m_BytesPerLine%4!=0)
            {
                    m_BytesPerLine=(m_BytesPerLine/4+1)*4;
            }
            
            m_pImageData = &m_pBitsInfo[sizeof(BITMAPINFOHEADER) + m_iPaletteEntry*sizeof(RGBQUAD)];
            file.Close();
            return TRUE;
    }
    void CImage:isplay(int x, int y, CDC *pDC)
    {
            :tretchDIBits(pDC->GetSafeHdc(),\
            x,y,\
            ((BITMAPINFOHEADER*)m_pBitsInfo)->biWidth,((BITMAPINFOHEADER*)m_pBitsInfo)->biHeight,\
            0,0,\
            ((BITMAPINFOHEADER*)m_pBitsInfo)->biWidth,((BITMAPINFOHEADER*)m_pBitsInfo)->biHeight,\
            m_pImageData,(BITMAPINFO *)m_pBitsInfo,\
            DIB_RGB_COLORS,SRCCOPY);
    }
    void CImage:isplay(int x, int y, int cx, int cy, CDC *pDC)
    {
            
            :tretchDIBits(pDC->GetSafeHdc(),\
            x,y,\
            cx,cy,\
            0,0,\
            ((BITMAPINFOHEADER*)m_pBitsInfo)->biWidth-100,((BITMAPINFOHEADER*)m_pBitsInfo)->biHeight,\
            m_pImageData,(LPBITMAPINFO)m_pBitsInfo,\
            DIB_RGB_COLORS,SRCCOPY);
    }
    void CImage::Empty()
    {
            if(m_pBitsInfo)
                    delete[] m_pBitsInfo;
            if(m_pBFI)
                    delete   m_pBFI;
            m_pBFI          = NULL;
            m_pImageData    = NULL;
            m_pBitsInfo     = NULL;
    }COLORREF CImage::GetColorData(int x, int y)
    {
            //x,y ---- The one-based index,i.e. the nature index.
            //x     ---- Column
            //y     ---- Row
            unsigned long temp;
            unsigned r,g,b;
            LPBITMAPINFOHEADER pInfo = (BITMAPINFOHEADER *)m_pBitsInfo;
            if((x<=0)||(x>pInfo->biWidth)||\
               (y<=0)||(y>pInfo->biHeight) )
            {
                    return RGB(0,0,0);
            }
            y = pInfo->biHeight - y + 1;
            temp = (y-1)*m_BytesPerLine + (x-1)*3;
            r = *(m_pImageData + temp);
            g = *(m_pImageData + temp + 1);
            b = *(m_pImageData + temp + 2);
            return RGB(r,g,b);
    }
      

  7.   

    unsigned CImage::GetGrayData(int x, int y)
    {
            //x,y   ---- The one-based index,i.e. the nature index.
            //x             ---- Column
            //y             ---- Row
            unsigned Gray;
            LPBITMAPINFOHEADER pInfo = (BITMAPINFOHEADER *)m_pBitsInfo;
            if((x<=0)||(x>pInfo->biWidth)||\
               (y<=0)||(y>pInfo->biHeight) )
            {
                    return 0;
            }
            y = pInfo->biHeight - y + 1;
            Gray = unsigned(*(m_pImageData + (y-1)*m_BytesPerLine + (x-1)));
            return Gray;
    }
    int CImage::GetDispHeight()
    {
            LPBITMAPINFOHEADER pInfo = (BITMAPINFOHEADER *)m_pBitsInfo;
            return int(pInfo->biHeight);
    }
    int CImage::GetDispWidth()
    {
            LPBITMAPINFOHEADER pInfo = (BITMAPINFOHEADER *)m_pBitsInfo;
            return int(pInfo->biWidth);
    }
    CImage& CImage:perator=(CImage &img)
    {
            Empty();
            m_iFileLength   = img.m_iFileLength;
            m_iPaletteEntry = img.m_iPaletteEntry;
            m_BytesPerLine  = img.m_BytesPerLine;
            unsigned long lLength = m_iFileLength - sizeof(BITMAPFILEHEADER);
            m_pBFI = (BITMAPFILEHEADER *)new BYTE[sizeof(BITMAPFILEHEADER)];
            CopyMemory(m_pBFI,img.m_pBFI,14L);
            m_pBitsInfo = new BYTE[lLength];        
            ZeroMemory(m_pBitsInfo, lLength);
            CopyMemory(m_pBitsInfo, img.m_pBitsInfo, lLength);
            
            m_pImageData = &m_pBitsInfo[sizeof(BITMAPINFOHEADER) + m_iPaletteEntry*sizeof(RGBQUAD)];
            return *this;
    }
    BOOL CImage:aveImage(LPCTSTR filename)
    {
            CFile file;
            if(!(file.Open(filename,CFile::modeCreate|CFile::modeWrite)))
            {
                    return FALSE;
            }
            file.Seek(0L,CFile::begin);
            file.Write(m_pBFI,sizeof(BITMAPFILEHEADER));
            file.WriteHuge(m_pBitsInfo,m_iFileLength - sizeof(BITMAPFILEHEADER));
            file.Close();
            
            return TRUE;
    }
     DLL部分如下:
    //showPic.cpp
    //////////////////////////////////////////////////////////////////////#include "ShowPic.h"
    #include "stdafx.h" 
    #include "ShowImg.h" 
    #include "Image.h"CImage img;extern "C" __declspec(dllexport) void showPic(HWND hwnd,HDC hDC,char* filename)
    {
     CDC * pDC=CDC::FromHandle(hDC);
     img.LoadImage((LPCTSTR)filename);
     img.Display(0,0,pDC);
     ReleaseDC(hwnd,hDC);
     //pDC=NULL;
     
    }
    //showPic.h
    //////////////////////////////////////////////////////////////////////
    extern "C" __declspec(dllexport) void showPic(HWND hwnd,HDC hDC,char* filename);
    DELPHI DLL调用申明部分:
    //
    //PIC.PAS
    ///////////////////////////////////////////////
    unit PIC;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;procedure showPic(hwnd:HWND;hDC:HDC;filenamechar); stdcall;implementation
    procedure showPic;external 'ShowImg.DLL' name 'showPic';end.
    //主窗口部分
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        Image1: TImage;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation
    uses PIC;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
            showPic(self.Handle,image1.Canvas.Handle,pchar('1.bmp'));
    end;end.