# 配信要求拡張API

配信要求または再配信要求を発行するAPIです。

## 構文

    INT  __stdcall  utlsendex( LPCSTR lpszFileID , LPCSTR lpszHostName ,
                    BOOL bResend , SHORT nPriority , BOOL bSync , INT nWait ,
                    LPCSTR lpszFileName , LPCSTR lpszGroup , BOOL bNp ,
                    HULMSGS* lpMsg , INT nTransMode );

## パラメーター説明

LPCSTR lpszFileID（IN）

  配信要求をするファイルIDを指定

  50バイト以内の文字列で指定します。省略する場合は“NULL”を指定します。

LPCSTR lpszHostName（IN）

  配信時の動的配信先ホスト名、または再配信時のホスト名を指定

  68バイト以内の文字列で指定します。

  「lpszGroup」と同時に指定できません。

  配信時、このパラメーターを使用するためにはシステム動作環境設定ファイルの動的パラメータ指定（dynparam）を「動的変更可能」に設定する必要があります。

  動的パラメータ指定の詳細は、以下を参照してください。

  HULFT10 for Windows アドミニストレーション マニュアル : 集配信

BOOL bResend（IN）

  再配信フラグを指定

  TRUE

    : 再配信要求を指定

  FALSE

    : 配信要求を指定

SHORT nPriority（IN）

  転送優先度を指定

  “1”～“256”の範囲で指定します。省略する場合は“0”を指定してください。

BOOL bSync（IN）

  同期転送フラグを指定

  再配信要求（bResend=TRUE）の場合は、同期転送指定はできません。

  TRUE

    : 同期転送する

  FALSE

    : 同期転送しない

INT nWait（IN）

  同期転送時の処理結果受信待ち時間を指定（秒）

  同期転送時に処理結果を受け取るために同期をとる時間を、“10”～“259200”の範囲で指定します。この時間に至ると、たとえ配信中であっても処理を戻します。その場合、転送結果は戻りませんので注意してください。

  同期転送指定の場合（bSync=TRUE）のみ有効となります。同期転送しない場合（bSync=FALSE）は“0”を指定します。

  同期転送指定時に“0”を指定した場合、システム動作環境設定ファイルのソケットリードタイムアウトで設定された値を使用します。

LPCSTR lpszFileName（IN）

  配信または再配信したいファイル名を指定

  200バイト以内の絶対パスで指定します。省略する場合は“NULL”を指定します。

  配信時は、省略すると、配信管理情報に登録されている配信ファイル名が設定されます。このパラメーターを使用するためにはシステム動作環境設定ファイルの動的パラメータ指定（dynparam）を「動的変更可能」に設定する必要があります。

  動的パラメータ指定の詳細は、以下を参照してください。

  HULFT10 for Windows アドミニストレーション マニュアル : 集配信

  再配信時は、すでに再配信待ち状態にあるファイル名を指定してください。再配信ファイルを動的に指定するパラメーターではありません。省略すると、パラメーターに指定されたホスト名またはファイルIDに一致したすべての転送の再配信が行われます。

LPCSTR lpszGroup（IN）

  配信したい転送グループIDを指定

  50バイト以内の文字列で指定します。

  「lpszHostName」と同時に指定できません。

  省略する場合は“NULL”を指定します。省略時は配信管理情報に登録されている、転送グループIDが設定されます。このパラメーターを使用するためにはシステム動作環境設定ファイルの動的パラメータ指定（dynparam）を「動的変更可能」に設定する必要があります。

  動的パラメータ指定の詳細は、以下を参照してください。

  HULFT10 for Windows アドミニストレーション マニュアル : 集配信

BOOL bNp（IN）

  チェックポイントフラグを指定

  配信要求（bResend=FALSE）の場合は、必ず“FALSE”を指定してください。

  TRUE

    : ファイルの先頭から再配信要求を行う

  FALSE

    : チェックポイント再配信要求を行う

HULMSGS* lpMsg（IN）

  メッセージ構造体を指定

  再配信要求（bResend=TRUE）の場合は、必ず“NULL”を指定してください。

  省略する場合も“NULL”を指定します。

  構造体の内容は以下のとおりです。

  拡張メッセージを使用しない場合は、メッセージ構造体に exmsginfoを含める必要はありません。

      typedef struct _tagHULMSGS {
          DWORD msgcnt;        // 格納しているメッセージ数
          CHAR** msginfo;      // メッセージテーブル($MSG0～$MSG5)
          CHAR** exmsginfo;    // 拡張メッセージテーブル($MSGL0 ～ $MSGL1)
      } HULMSGS;

  DWORD msgcnt

    格納しているメッセージ数

    拡張メッセージを使用しない場合は“6”を指定してください。

    拡張メッセージを使用する場合は“8”を指定してください。

  CHAR** msginfo

    メッセージを指定

    各メッセージは最大50バイトまで指定できます。「メッセージ数（6）×（最大長50バイト+1）」の領域を固定で確保してください。各メッセージは先頭から51バイトごとに指定してください。関数の終了時には、メモリーの解放を行ってください。

  CHAR** exmsginfo

    拡張メッセージを指定

    拡張メッセージを使用する場合に指定します。

    拡張メッセージは最大200バイトまで指定できます。「拡張メッセージ数（2）×（最大長200バイト+1）」の領域を固定で確保してください。各メッセージは先頭から201バイトごとに指定してください。関数の終了時には、メモリーの解放を行ってください。

INT nTransMode（IN）

  転送モードを指定

  固定で“0”を指定してください。

## 戻り値

正常時は「0」です。エラー時のステータスはutlsend.exeのエラーコードと同様です。

詳細は、以下を参照してください。

HULFT10 for Windows エラーコード・メッセージ : 配信要求コマンド（utlsend.exe）

## 使用例

### Visual C++から使用する場合（拡張メッセージを使用しない場合）

    #include <windows.h>
    #include <stdio.h>

    #pragma pack(push,8)
    typedef struct {
        DWORD msgcnt;
        CHAR** msginfo;
    } HULMSGS;
    #pragma pack(pop)

    typedef INT (__stdcall *LPUTLSENDEX)(
            LPCSTR lpszFileID, LPCSTR lpszHostName, BOOL bResend,
            SHORT nPriority, BOOL bSync, INT nWait, LPCSTR lpszFileName,
            LPCSTR lpszGroup, BOOL bNp,
            HULMSGS* lpMsg, INT nTransMode);

    int main()
    {
        CHAR szFileID[50+1];
        CHAR szHostName[68+1];
        SHORT nPriority;
        BOOL bResend;
        BOOL bSync;
        INT nWait;
        CHAR szFileName[200+1];
        CHAR szGroup[50+1];
        BOOL bNp;
        HULMSGS sMsgInfo;
        CHAR* msgbodyptr[6];
        CHAR msgbody[(50+1)*6];
        INT nTransMode;
        INT i;
        HMODULE hHulDll;
        HMODULE hApiDll;
        LPUTLSENDEX lpUtlsendex;
        INT nStatus;

        strcpy_s(szFileID, sizeof(szFileID), "TEST0001");
        strcpy_s(szHostName, sizeof(szHostName), "");
        bResend = FALSE;
        nPriority = 50;
        bSync = TRUE;
        nWait = 300;
        strcpy_s(szFileName, sizeof(szFileName), "");
        strcpy_s(szGroup, sizeof(szGroup), "");
        bNp = FALSE;
        nTransMode = 0;

        sMsgInfo.msgcnt = 6;
        sMsgInfo.msginfo = msgbodyptr;
        for (i = 0; i < 6; i++)
        {
            sMsgInfo.msginfo[i] = &msgbody[51*i];
        }
        strcpy_s(sMsgInfo.msginfo[0], 51, "C:\\hulft\\");
        strcpy_s(sMsgInfo.msginfo[1], 51, "");
        strcpy_s(sMsgInfo.msginfo[2], 51, "");
        strcpy_s(sMsgInfo.msginfo[3], 51, "Data1.dat");
        strcpy_s(sMsgInfo.msginfo[4], 51, "");
        strcpy_s(sMsgInfo.msginfo[5], 51, "");

        hApiDll = LoadLibraryEx("C:\\HULFT Family\\hulft10\\bin\\hulapi.dll", NULL,
        LOAD_WITH_ALTERED_SEARCH_PATH);
        if (hApiDll == NULL)
        {
            printf("Unable to load hulapi.dll."
                "(Error code = %lu)\n", GetLastError());
            FreeLibrary(hHulDll);
            return 2;
        }
        lpUtlsendex = (LPUTLSENDEX)GetProcAddress(hApiDll, "utlsendex");
        if (lpUtlsendex == NULL)
        {
            printf("Unable to retrieves the address of HULFT API."
                "(Error code=%lu)\n", GetLastError());
            FreeLibrary(hApiDll);
            FreeLibrary(hHulDll);
            return 3;
        }
        nStatus = lpUtlsendex(szFileID, szHostName, bResend, nPriority,
                bSync, nWait, szFileName, szGroup, bNp,
                &sMsgInfo, nTransMode);
        if (nStatus == 0)
        {
            printf("Terminated normally.\n");
        }
        else
        {
            printf("Error occurred when calling HULFT API."
                "(Returned value=%d)\n", nStatus);
        }
        FreeLibrary(hApiDll);
        FreeLibrary(hHulDll);
        return 0;
    }

### Visual C++から使用する場合（拡張メッセージを使用する場合）

    #include <windows.h>
    #include <stdio.h>

    #pragma pack(push,8)
    typedef struct {
        DWORD msgcnt;
        CHAR** msginfo;
        CHAR** exmsginfo;
    } HULMSGS;
    #pragma pack(pop)

    typedef INT (__stdcall *LPUTLSENDEX)(
            LPCSTR lpszFileID, LPCSTR lpszHostName, BOOL bResend,
            SHORT nPriority, BOOL bSync, INT nWait, LPCSTR lpszFileName,
            LPCSTR lpszGroup, BOOL bNp,
            HULMSGS* lpMsg, INT nTransMode);

    int main()
    {
        CHAR szFileID[50+1];
        CHAR szHostName[68+1];
        SHORT nPriority;
        BOOL bResend;
        BOOL bSync;
        INT nWait;
        CHAR szFileName[200+1];
        CHAR szGroup[50+1];
        BOOL bNp;
        HULMSGS sMsgInfo;
        CHAR* msgbodyptr[6];
        CHAR msgbody[(50+1)*6];
        CHAR* exmsgbodyptr[2];
        CHAR exmsgbody[(200+1)*2];
        INT nTransMode;
        INT i;
        HMODULE hHulDll;
        HMODULE hApiDll;
        LPUTLSENDEX lpUtlsendex;
        INT nStatus;

        strcpy_s(szFileID, sizeof(szFileID), "TEST0001");
        strcpy_s(szHostName, sizeof(szHostName), "");
        bResend = FALSE;
        nPriority = 50;
        bSync = TRUE;
        nWait = 300;
        strcpy_s(szFileName, sizeof(szFileName), "");
        strcpy_s(szGroup, sizeof(szGroup), "");
        bNp = FALSE;
        nTransMode = 0;

        sMsgInfo.msgcnt = 8;
        sMsgInfo.msginfo = msgbodyptr;
        for (i = 0; i < 6; i++)
        {
            sMsgInfo.msginfo[i] = &msgbody[51*i];
        }
        strcpy_s(sMsgInfo.msginfo[0], 51, "C:\\hulft\\");
        strcpy_s(sMsgInfo.msginfo[1], 51, "");
        strcpy_s(sMsgInfo.msginfo[2], 51, "");
        strcpy_s(sMsgInfo.msginfo[3], 51, "Data1.dat");
        strcpy_s(sMsgInfo.msginfo[4], 51, "");
        strcpy_s(sMsgInfo.msginfo[5], 51, "");
        sMsgInfo.exmsginfo = exmsgbodyptr;
        for (i = 0; i < 2; i++)
        {
            sMsgInfo.exmsginfo[i] = &exmsgbody[201*i];
        }
        strcpy_s(sMsgInfo.exmsginfo[0], 201, "Data2.dat");
        strcpy_s(sMsgInfo.exmsginfo[1], 201, "");

        hApiDll = LoadLibraryEx("C:\\HULFT Family\\hulft10\\bin\\hulapi.dll", NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
        if (hApiDll == NULL)
        {
            printf("Unable to load hulapi.dll."
                "(Error code = %lu)\n", GetLastError());
            FreeLibrary(hHulDll);
            return 2;
        }
        lpUtlsendex = (LPUTLSENDEX)GetProcAddress(hApiDll, "utlsendex");
        if (lpUtlsendex == NULL)
        {
            printf("Unable to retrieves the address of HULFT API."
                "(Error code=%lu)\n", GetLastError());
            FreeLibrary(hApiDll);
            FreeLibrary(hHulDll);
            return 3;
        }
        nStatus = lpUtlsendex(szFileID, szHostName, bResend, nPriority,
                bSync, nWait, szFileName, szGroup, bNp,
                &sMsgInfo, nTransMode);
        if (nStatus == 0)
        {
            printf("Terminated normally.\n");
        }
        else
        {
            printf("Error occurred when calling HULFT API."
                "(Returned value=%d)\n", nStatus);
        }
        FreeLibrary(hApiDll);
        FreeLibrary(hHulDll);
        return 0;
    }