n yangi qiymat tayinlanadigan parametrning seriya raqami. Bu OUTPUT parametri bo'lishi kerak.
pbData chiqish parametrining qiymatini belgilash uchun mijozga yuboriladigan ma'lumotlarga ega buferga ko'rsatgich.
cbLen yuborilgan ma'lumotlar buferining uzunligi. Agar o'tkazilgan OUTPUT parametrining ma'lumotlar turi doimiy uzunlikdagi ma'lumotlarni aniqlasa va NULL qiymatlarni saqlashga ruxsat bermasa (masalan, SRVBIT yoki SRVINT1), u holda funktsiya cbLen parametrini e'tiborsiz qoldiradi. CbLen = 0 nol uzunlikdagi ma'lumotlarni bildiradi va fNull FALSE ga o'rnatilishi kerak.
fNull Agar qaytish parametri NULL va cbLen 0 bo'lishi kerak bo'lsa, buni TRUE ga o'rnating, aks holda funktsiya muvaffaqiyatsiz bo'ladi. Boshqa barcha holatlarda fNull = FALSE.
Muvaffaqiyatli bo'lsa, funktsiya SUCCEED ni qaytaradi. Qaytish qiymati FAIL bo'lsa, qo'ng'iroq muvaffaqiyatsiz bo'ldi. Hammasi oddiy va tushunarli
Endi biz birinchi kengaytirilgan saqlangan protseduramizni yozish uchun yetarli ma'lumotga egamiz, bu unga berilgan parametr orqali qiymat qaytaradi.Deylik, an'anaga ko'ra, bu Salom dunyo qatori bo'ladi! Misolning disk raskadrovka versiyasini bu yerdan yuklab olish mumkin.
#o'z ichiga oladi
#XP_NOERROR 0 ni aniqlang
#XP_XATOSI 1-ni aniqlang
#MAX_SERVER_ERROR 20000 ni aniqlang
#XP_HELLO_ERROR MAX_SERVER_ERROR + 1 ni aniqlang
bekor chop etish xatosi (SRV_PROC *, CHAR *);
#ifdef __cplusplus
tashqi "C" (
#endif
SRVRETCODE __declspec (dllexport) xp_helloworld (SRV_PROC * pSrvProc);
#ifdef __cplusplus
}
#endif
SRVRETCODE xp_helloworld (SRV_PROC * pSrvProc)
{
char szText = "Salom dunyo!";
BYTE bType;
ULONG cbMaxLen;
ULONG cbActualLen;
BOOL fNull;
/ * Kengaytirilgan saqlangan ob'ektlar sonini aniqlang
parametr protsedurasi * /
agar (srv_rpcparams (pSrvProc)! = 1)
{
printError (pSrvProc, "Parametrlar soni noto'g'ri!");
qaytish (XP_ERROR);
}
/ * O'tkazilgan parametrlarning ma'lumotlar turi va uzunligi haqida ma'lumot oling * /
agar (srv_paraminfo (pSrvProc, 1 va bType, & cbMaxLen,
& cbActualLen, NULL va fNull) == FAIL)
{
chop etish xatosi (pSrvProc,
"Kirish parametrlari haqida ma'lumot olinmadi ...");
qaytish (XP_ERROR);
}
/ * O'tkazilgan OUTPUT parametri parametr ekanligini tekshiring * /
agar ((srv_paramstatus (pSrvProc, 1) va SRV_PARAMRETURN) == FAIL)
{
chop etish xatosi (pSrvProc,
"O'tkazilgan parametr OUTPUT parametri emas!");
qaytish (XP_ERROR);
}
/ * O'tkazilgan parametrning ma'lumotlar turini tekshiring * /
agar (bType! = SRVBIGVARCHAR && bType! = SRVBIGCHAR)
{
printError (pSrvProc, "O'tkazilgan parametrning noto'g'ri turi!");
qaytish (XP_ERROR);
}
/ * O'tkazilgan parametr qaytarilgan satrni saqlash uchun etarlicha uzun ekanligiga ishonch hosil qiling * /
agar (cbMaxLen< strlen(szText))
{
chop etish xatosi (pSrvProc,
"O'tkazilgan parametr qaytarilgan n qatorni saqlash uchun etarlicha uzun emas!");
qaytish (XP_ERROR);
}
/ * OUTPUT parametr qiymatini o'rnating * /
agar (FAIL == srv_paramsetoutput (pSrvProc, 1, (BYTE *) szText, 13, FALSE))
{
chop etish xatosi (pSrvProc,
"OUTPUT parametrining qiymatini o'rnatolmayman ...");
qaytish (XP_ERROR);
}
srv_senddone (pSrvProc, (SRV_DONE_COUNT | SRV_DONE_MORE), 0, 1);
qaytish (XP_NOERROR);
}
bekor chop etish xatosi (SRV_PROC * pSrvProc, CHAR * szErrorMsg)
{
srv_sendmsg (pSrvProc, SRV_MSG_ERROR, XP_HELLO_ERROR, SRV_INFO, 1,
NULL, 0, 0, szErrorMsg, SRV_NULLTERM);
Srv_senddone (pSrvProc, (SRV_DONE_ERROR | SRV_DONE_MORE), 0, 0);
}
srv_sendmsg va srv_senddone funksiyalari hisobga olinmadi. srv_sendmsg funktsiyasi mijozga xabar yuborish uchun ishlatiladi. Mana uning prototipi:
int srv_sendmsg (
SRV_PROC * srvproc,
int msgtype,
DBINT xabarnomasi,
DBTINYINT sinfi,
DBTINYINT holati,
DBCHAR * rpc nomi,
int rpcnamelen,
DBUSMALLINT choyshab,
DBCHAR * xabari,
int msglen
);
msgtype mijozga yuboriladigan xabar turini belgilaydi. SRV_MSG_INFO doimiysi axborot xabarini, SRV_MSG_ERROR esa xato xabarini bildiradi;
msgnum xabar raqami;
Do'stlaringiz bilan baham: |