|
使用toolkit开发trigger的程序时,往往需要能够连续通过trigger来触发dll中的函数.
1 _+ w. {3 M+ q' n5 y我碰到的问题: * m- }* i) p$ v% o& I
1.配置trigger:
! o& G3 b4 d; I5 j- l9 R Name: CimDll
4 v8 N/ A6 w8 Y q, N. T( T Event: Create PIV 1 }' u2 Q1 e9 i: b2 ^+ p
Time: POST
' O l& z( _" W! { RequireNO ' y! c, W0 q3 K! G
DLL:Cim.dll
" \: V" k& T" u( p* E( | Function DMTPIVCreatePostOperation 7 `/ f K+ g1 \6 X2 c* H7 Y
$ N. B W) z$ L7 s- ]" Q
2.源代码: # u8 M+ F* }* i# I7 I2 T7 F
int PDMDLLInit() 6 U5 E8 N( H( y1 U+ ~# n2 q1 x; { U
{
6 Y: n R5 |& R) u: V A PTCERROR pdm_status;
2 a. [; W9 a+ X/ I @ FILE *g_pfileLog; g_pfileLog =fopen("test.dat","w"); , E' F- ]/ z7 J% b4 ~) }0 T
setbuf(g_pfileLog,NULL);
; @1 M; u5 ]0 u m& m# }. W fprintf(g_pfileLog,"begin test\n");
. v% W" b1 e1 k4 T1 z- a pdm_status = PDMTriggerRegister(" DMTPIVCreatePostOperation", PDMTPIVCreatePostOperation); 4 V9 g) |# b8 l6 A+ P* S
if (pdm_status != PDM_SUCCESS)
9 O8 s4 o$ L, g* F0 b. h2 g { ; a& ?. Z8 t0 b
printf("Failed to Register Trigger PIV Create Post.\n");
1 K& z; {3 O& w- o. q! e }
5 G5 p, z5 W/ C$ p' t u! l return (pdm_status);
) H& Z0 D* a% ]( L9 Z4 n' l1 @}
9 |) k$ R# Q# X4 N2 D8 p% o0 _int PDMTPIVCreatePostOperation(int argc, void **argv) : i. t/ D C; g- `. w
{ & J( d) |8 t2 [3 H h
fprintf(g_pfileLog,"test\n"); 1 k: c9 u1 O0 @3 [; t
.....
+ q) o6 d8 B$ V fprintf(g_pfileLog,"end test\n");
# U8 f% e: a8 m8 T, o fclose(g_pfileLog);
. B% _$ g8 {. f* ?3 p7 y% K}
6 C2 e1 d9 ^, y( b 结果:以上代码存在的问题:如果我们在第一次checkin到C/S中后,删除test.dat文件,然后再进行checkin时,发现没有再生成test.dat,在函数PDMTPIVCreatePostOperation()中所进行的对文件的操作都无效. 3 w* c% L1 v% f
原因:我们使用trigger触发时,真正起作用的是函数 DMTPIVCreatePostOperation(),而PDMDLLInit()只是在第一次checkin时起作用,所以在第一次调用PDMTPIVCreatePostOperation()后,我就fclose(g_pfileLog),所以出现了上面的情况.所以注意的是:不要把一些重要的东西放在函数PDMDLLInit()中. |
|