| アプリケーション |
| ソースマネージャ |
TW_UNIT16 FAR PASCAL DSM_Entry ( pTW_IDENTITY pOrigin, // source of message pTW_IDENTITY pDest, // destination of message TW_UNIT32 DG, // data group ID: DG_xxx TW_UNIT16 DAT, // data argument type: DAT_xxx TW_UNIT16 MSG, // message ID: MESxxx TW_MEMREF pData // pointer to data ); |
TW_UINT16 rc;
TW_STATUS twStatus;
char *strMsg;
rc = lpfnDSM_Entry(pAppId,pSourceId,DG_CONTROL,DAT_STATUS,MSG_GET,&twStatus);
switch (twStatus.ConditionCode){
case TWCC_BADCAP:
・・・
break;
case TWCC_CAPUNSUPPORTED:
・・・
break;
case TWCC_CAPBADOPERATION:
・・・
break;
case TWCC_CAPSEQERROR:
・・・
break;
case TWCC_BADDEST:
・・・
break;
case TWCC_BADVALUE:
・・・
break;
case TWCC_SEQERROR:
・・・
break;
default:
//Unknown Error
・・・
break;
}
|
float Fix32ToFloat (TW_FIX32 fix32)
{
float floater;
floater = (float)fix32.Whole + (float)fix32.Frac / (float)65536.0;
return floater;
}
TW_FIX32 FloatToFix32 (float floater)
{
TW_FIX32 Fix32_value;
TW_INT32 value = (TW_INT32) (floater * 65536.0 + 0.5);
Fix32_value.Whole =(short)( value >> 16);
Fix32_value.Frac =(short)( value & 0x0000ffffL);
return (Fix32_value);
}
|
TW_EVENT twEvent;
TW_INT16 rc;
while (GetMessage ( (LPMSG) &msg, NULL, 0, 0) ){
// もしソースがイネーブルの場合以下を実行
// ※実際にはif文等でイネーブル時だけ実行させるようにして下さい
twEvent.pEvent = (TW_MEMREF)&msg;
twEvent.TWMessage = MSG_NULL;
rc = lpfnDSM_Entry(pAppId,pSourceId,
DG_CONTROL,DAT_EVENT,MSG_PROCESSEVENT,
(TW_MEMREF)&twEvent);
// ソースからのメッセージ取得
switch (twEvent.TWMessage){
case MSG_XFERREADY:
// TWAINがレディ(状態6)になった
SetupAndTransferImage(NULL);
break;
case MSG_CLOSEDSREQ:
// ユーザ指示でTWAINから
// ソースのディセーブル&クローズ要求が来た
DisableAndCloseSource(NULL);
break;
case MSG_NULL:
// ソースからメッセージは来ていない
break;
}
// 以下は通常の(TWAIN以外の)ウィンドウイベント
if (rc == TWRC_NOTDSEVENT){
TranslateMessage( (LPMSG) &msg);
DispatchMessage( (LPMSG) &msg);
}
}
|
| 1.Pre-Session(作業前) | ソースマネージャはロードされていない |
| 2.Source Manager Loaded(ソースマネージャロード済み) | アプリ:エントリポイントの取得 |
| 3.Source Manager Opened(ソースマネージャオープン済み) | ユーザ:ソースのセレクト |
| 4.Source Open(ソースオープン) | 能力の調整(ネゴ) |
| 5.Source Enable(ソースイネーブル) | ソース:ユーザインタフェースの提示 |
| 6.Transfer Ready ( 転送準備済み) | アプリ:画像(オーディオ)情報の要求 |
| 7.Transferring (転送中) | データの転送 |
| 1→2 | アプリ:ソースマネージャのロード |
| 1←2 | アプリ:ソースマネージャのアンロード |
| 2→3 | アプリ:ソースマネージャのオープン |
| 2←3 | アプリ:ソースマネージャのクローズ |
| 3→4 | アプリ:ソースのオープン |
| 3←4 | アプリ:ソースのクローズ |
| 4→5 | アプリ:ソースをイネーブルにする |
| 4←5 | ソース:転送ディセーブルをアプリに通知 or アプリ:ソースをディセーブルにする |
| 5→6 | ソース:アプリケーションに転送準備が整ったことを通知 |
| 5←6 | ソース:転送保留分の画像がもう無いことをアプリに通知 |
| 6→7 | アプリ:転送をソースに指示 |
| 6←7 | アプリ:転送終了に応答 |
DSMENTRYPROC lpfnDSM_Entry;
HMODULE hDSMDLL;
・・・
BOOL LoadDLL()
{
char szDllFile[MAX_PATH];
OFSTRUCT of;
// DLLパスの作成
GetWindowsDirectory (szDllFile, sizeof(szDllFile));
if (szDllFile [(lstrlen (szDllFile) - 1)] != '\\'){
lstrcat( szDllFile, "\\" );
}
lstrcat( szDllFile, "TWAIN_32.DLL" );
// DLLファイルの確認
if (OpenFile(szDllFile, &of, OF_EXIST) == -1)
return FALSE;
// DLLのロード
if ( (hDSMDLL = LoadLibrary(szDllFile)) == NULL)
return FALSE;
// ポインタの取得
if( (lpfnDSM_Entry = (DSMENTRYPROC)GetProcAddress(hDSMDLL,"DSM_Entry")) == NULL){
UnLoadDLL();
return FALSE;
}
return TRUE;
}
BOOL UnLoadDLL()
{
if(hDSMDLL)
return FreeLibrary(hDSMDLL);
return TRUE;
}
|
TW_UINT16 rc; // 戻値 // アプリケーションIDの初期化 pAppId->Id = 0; // 0にする pAppId->Version.MajorNum = 0; // アプリケーションのバージョンメジャー番号 pAppId->Version.MinorNum = 1; // アプリケーションのバージョンマイナー番号 pAppId->Version.Language = TWLG_JAPANESE;// 言語 pAppId->Version.Country = TWCY_JAPAN; // 国 lstrcpy (pAppId->Version.Info, "0.1"); // バージョン文字列 pAppId->ProtocolMajor = TWON_PROTOCOLMAJOR; pAppId->ProtocolMinor = TWON_PROTOCOLMINOR; pAppId->SupportedGroups = DG_IMAGE | DG_CONTROL; lstrcpy (pAppId->Manufacturer, "BearBeetle"); //アプリのメーカー lstrcpy (pAppId->ProductFamily, "BB LAB"); //アプリの製品ファミリー lstrcpy (pAppId->ProductName, "BB TWAIN SAMPLE");//アプリの製品名 // ソースマネージャのオープン rc=lpfnDSM_Entry(pAppId,NULL,DG_CONTROL,DAT_PARENT,MSG_OPENDSM,(TW_MEMREF)&hWnd); if(rc != TWRC_SUCCESS) return FALSE; return TRUE; |
・・・ rc=lpfnDSM_Entry(pAppId,NULL,DG_CONTROL,DAT_PARENT,MSG_CLOSEDSM,(TW_MEMREF)&hWnd); if(rc != TWRC_SUCCESS) return FALSE; return TRUE; |
・・・ // データソースIDはシステムデフォルト値にする場合 pSourceId->ProductName[0]='\0'; pSourceId->Id=0; |
rc=lpfnDSM_Entry(pAppId,NULL,DG_CONTROL,DAT_IDENTITY,MSG_OPENDS,pSourceId); if(rc != TWRC_SUCCESS) return FALSE; return TRUE; ・・・ |
rc=lpfnDSM_Entry(pAppId,NULL,DG_CONTROL,DAT_IDENTITY,MSG_CLOSEDS,pSourceId); if(rc != TWRC_SUCCESS) エラー処理 |
TW_CAPABILITY twCapability;
TW_UINT16 rc;
float flPhysWidth;
twCapability.Cap=ICAP_PHYSICALWIDTH; // 設定内容をICAP_XXXで指定する
twCapability.ConType = TWON_ONEVALUE; // コンテナのタイプを指定する
twCapability.hContainer = NULL; // NULLを指定する
rc=lpfnDSM_Entry(pAppId,pSourceId,DG_CONTROL,DAT_CAPABILITY,MSG_GET,(TW_MEMREF)&twCapability);
if(twCapability.hContainer){
ptwOneValue = (pTW_ONEVALUE) GlobalLock((HANDLE)twCapability.hContainer);
flPhysWidth = Fix32ToFloat((pTW_FIX32)&ptwOneValue->Item);
GlobalUnlock((HANDLE)twCapability.hContainer);
GlobalFree((HANDLE)twCapability.hContainer);
}
if(rc != TWRC_SUCCESS){
エラー処理
}
|
TW_FIX32 tw; float fReso; // fResoに解像度を設定する fReso = xxx.0; // コンテナ確保 twCapability.hContainer = GlobalAlloc(GHND,sizeof(TW_ONEVALUE)); ptwOneValue = (pTW_ONEVALUE)GlobalLock(twCapability.hContainer); // OneValueの値を設定する ptwOneValue->ItemType=TWTY_FIX32; tw=FloatToFix32(flReso); memcpy((void*)&ptwOneValue->Item,(void *)&tw,sizeof(TW_FIX32)); // コンテナを設定する twCapability.Cap=ICAP_YRESOLUTION; // 設定内容をICAP_XXXで指定する twCapability.ConType = TWON_ONEVALUE; // コンテナのタイプを指定する // コマンド rc=lpfnDSM_Entry(pAppId,pSourceId,DG_CONTROL,DAT_CAPABILITY,MSG_SET,(TW_MEMREF)&twCapability); // コンテナ開放 GlobalUnlock(twCapability.hContainer); GlobalFree(twCapability.hContainer); |
TW_UINT16 rc; // 戻値
TW_USERINTERFACE ui;
ui.ShowUI=FALSE;
ui.ModalUI=FALSE;
ui.hParent=親ウィンドウ(ShowUI=TRUEの時は必須)
rc=lpfnDSM_Entry(pAppId,pSourceId,DG_CONTROL,DAT_USERINTERFACE,MSG_ENABLEDS,&ui);
if(rc != TWRC_SUCCESS){
エラー処理
}
|
TW_UINT16 rc; // 戻値
TW_USERINTERFACE ui;
ui.ShowUI=FALSE;
ui.ModalUI=FALSE;
ui.hParent=親ウィンドウ(要らないかもしれない)
rc=lpfnDSM_Entry(pAppId,pSourceId,DG_CONTROL,DAT_USERINTERFACE,MSG_DISABLEDS,&ui);
if(rc != TWRC_SUCCESS){
エラー処理
}
|
TW_UINT16 rc;
TW_UINT32 hBitmap;
TW_BOOL PendingXfers = TRUE;
LPBITMAPINFOHEADER lpDib;
// 画像転送
hBitmap = NULL;
rc = lpfnDSM_Entry(pAppId,pSourceId,DG_IMAGE,DAT_IMAGENATIVEXFER,MSG_GET,(TW_MEMREF)&hBitmap);
lpDib = (LPBITMAPINFOHEADER)GlobalLock((void*)hBitmap);
// 戻値のチェック
switch(rc){
case TWRC_XFERDONE:
if(lpDib!=NULL){
// DIBオブジェクトを取得できました
・・・・
}
break;
case TWRC_CANCEL:
// ユーザによってキャンセルされました
・・・
break;
case TWRC_FAILURE:
// 転送中にエラーが発生しました
・・・
break;
}
if(lpdib!=NULL){
GlobalUnlock((void*)hBitmap);
GlobalFree((void*)hBitmap);
}
|
[ホームへ戻る]
【改訂記録】
2000/06/21版:公開
2001/11/02版:誤記修正