Top / Software / Image / ImageProPlus / Tips / AutoPro_Programing

.NetプログラムからのAuto Pro Functionの利用方法

Auto Pro 関数を .NetのVB や VC++ や VC#などから呼び出すには、ヘルプファイルに書いてあるようにSDKを手に入れる方法*1があるが、dllに入っている関数を、ラッパーを通して呼び出すという方法もある。 この場合、libファイルやヘッダーファイルは無くても、プログラムからIPPの関数を呼び出すことができる。(もちろん IPPが起動していなくてはだめなわけであるが)。

必要なのは、各関数の引数の型と引数に使われる構造体の構造と定数の情報とどのDLLに望みの関数が入っているかの情報である。ほとんどの情報は、AutoPro関数のヘルプファイルから手にいれることができる。

DLLからもどってくる値を受け取るには、固定したメモリを用意して関数をよぶ必要がある。

以下に C++/CLIでプログラムしたいくつかの関数を呼び出すためのクラス定義を示す。
これらは、以下のサイトを参考にプログラムした

C++/CLI

定義側

#pragma once
#include "ipcdefine.h"      // 定数や構造体をdefineしているファイル
 
using namespace System;
using namespace System::IO;
using namespace System::Text;
using namespace System::Runtime::InteropServices;

ref class CIPPControl
{
  public:
	int i;
	CIPPControl(){};
	void operator=(CIPPControl ^r) {i = r->i;}
	CIPPControl(CIPPControl ^ r) : i(r->i) {}
  private:
	[DllImport(IMPDLL1, EntryPoint = "IpDocGet")] 
	static long IpDocGet32(short Command, short wParam, IntPtr lpParam);
  public:
	template <class T> [DllImport(IMPDLL1)] 
	static long IpDocGetArea(short DocId, LPRECT  rArea, T * lpBuf, short gMode);	
	[DllImport(IMPDLL1)] 
	static long IpAppCloseAll(void);
	[DllImport(IMPDLL1)] 
	static long IpAppGet(short Command, short wParam, long * lpParam);
	[DllImport(IMPDLL1)] 
	static long IpWsLoad(System::String ^ FileName, System::String ^ FileFormat);
	[DllImport(IMPDLL1)] 
	static long IpWsCreate(short Width, short Height, short Dpi, short Class);	
	[DllImport(IMPDLL1)] 
	static long IpWsCreateEx(short Width, short Height, short Dpi, short Class , long NumFrames);
	template <class T> [DllImport(IMPDLL1)] 
	static long IpDocPutArea(short DocId, LPRECT rArea, T * lpBuf, short pMode); 
	[DllImport(IMPDLL1)] 
	static long IpWsChangeDescription(short DescriptionType, System::String ^ Description);
	[DllImport(IMPDLL1)] 
	static long IpAppUpdateDoc(short DocId);

  template <class T> static long IpDocGet(short Command,short wParam, T ^ *Param)
  {
    IntPtr tempPtr = Marshal::AllocCoTaskMem(Marshal::SizeOf(*Param));
    long ret =IpDocGet32(Command,wParam, tempPtr);
    *Param=(T ^) Marshal::PtrToStructure(tempPtr, (*Param)->GetType());
    Marshal::FreeCoTaskMem(tempPtr);
    return ret;
  };
};

呼び出し側

int main(array<System::String ^> ^args)
{
  IPDOCINFO ^docinfo = gcnew IPDOCINFO;
  CIPPControl ipp = gcnew CIPPControl();
  int ret;
  long lHandle = 0;

  ret= ipp.IpAppGet(GETAPPWND , 0 , &lHandle);
  
  ret =ipp.IpWsCreate(1024,1024,100,IMC_GRAY16);

  long DocID=ipp.IpWsLoad("C:\TEST.tiff", "TIF");

  ipp.IpDocGet(GETDOCINFO,DOCSEL_ACTIVE, &docinfo);

  return(0);
}

*1 ver6用のSDKは、登録ユーザがmediacybaneticsに連絡すればもらえる

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-04-29 (火) 22:06:43 (3734d)