|
使用toolkit开发trigger的程序时,往往需要能够连续通过trigger来触发dll中的函数.
2 F$ a; R% k0 \& V6 C我碰到的问题: 4 B! g; w$ O5 P" {7 D& X- K& q: x
1.配置trigger:
) o! t$ q5 L. G- D' \ q- Z Name: CimDll
- t' |2 h* k( g" u/ K( H7 j1 Q0 s. C Event: Create PIV . X# x3 H+ ]8 L$ V) L! \
Time: POST
3 o% u1 I- T4 r/ e" a RequireNO
' d' i+ }5 K4 Q; A- h& T DLL:Cim.dll
3 H/ M4 G5 ~7 L2 s6 ?8 z3 q FunctionDMTPIVCreatePostOperation
' k5 O0 V; W0 L4 z7 O 2 o8 ^! d. h l0 N
2.源代码: ( o7 L; O) x; X- S2 Z$ A+ _ C7 z9 L
int PDMDLLInit() 4 Y. _! Z0 q6 }% e" M
{
5 }2 d& W7 ?, F" A2 V! Q" l* p6 V0 J% r% E PTCERROR pdm_status; 1 j4 }" N1 U8 [
FILE *g_pfileLog; g_pfileLog =fopen("test.dat","w"); 3 X( S3 U$ v. O& n% G# t1 O
setbuf(g_pfileLog,NULL);
3 Z: n; P( _# D6 e fprintf(g_pfileLog,"begin test\n");
' l8 C' R/ e3 |8 s+ T$ q0 H' A+ H pdm_status = PDMTriggerRegister("DMTPIVCreatePostOperation", PDMTPIVCreatePostOperation);
1 N3 {& E6 h9 o! T, K* Z" }1 K if (pdm_status != PDM_SUCCESS) + i. C, {* y) d* F9 ?$ H# h
{ 4 X% s7 V. A' O& c
printf("Failed to Register Trigger PIV Create Post.\n");
: @: S4 S$ i& t" V* F r S( t } ) R; s5 m- L6 g
return (pdm_status);
6 C( F4 ?$ S: J' ]- h; w) O6 R}
R1 |7 x1 j. j4 D |4 ^+ Qint PDMTPIVCreatePostOperation(int argc, void **argv)
% p3 H' g+ o3 f( z! A8 g{
( O+ s* [- p& b. U& h fprintf(g_pfileLog,"test\n");
1 |/ L0 F" O8 W& o# ] ..... : t! w& `1 ~2 C: Z+ t6 p- U
fprintf(g_pfileLog,"end test\n");
) }+ Z# Z* E: T' r# ` fclose(g_pfileLog); 2 Q; a% E0 h% I( {
} # b; F- q6 Y8 w% v! }
结果:以上代码存在的问题:如果我们在第一次checkin到C/S中后,删除test.dat文件,然后再进行checkin时,发现没有再生成test.dat,在函数PDMTPIVCreatePostOperation()中所进行的对文件的操作都无效. & M% u8 [ C! ^! x8 I( R
原因:我们使用trigger触发时,真正起作用的是函数DMTPIVCreatePostOperation(),而PDMDLLInit()只是在第一次checkin时起作用,所以在第一次调用PDMTPIVCreatePostOperation()后,我就fclose(g_pfileLog),所以出现了上面的情况.所以注意的是:不要把一些重要的东西放在函数PDMDLLInit()中. |
|