|
使用toolkit开发trigger的程序时,往往需要能够连续通过trigger来触发dll中的函数.
3 }/ b/ x( K# n! Z2 v( g6 t我碰到的问题: 4 ?+ ^% z% x6 c8 _- P' s; S! s' e
1.配置trigger: $ A" M$ `' [2 i' j
Name: CimDll - h5 i7 o- _" m4 n z1 u# z
Event: Create PIV
% i$ q- m7 |4 h. O- t3 R Time: POST ! W* C) x% B) f: S! d0 x4 }
RequireNO 3 Q. u* ?# h9 l& m
DLL:Cim.dll 2 D8 Q) v0 ?) g
Function DMTPIVCreatePostOperation ; a/ w9 {4 q, k
7 e' d. p+ @0 T& Y2 m& [, ~
2.源代码: 0 b) ~4 {3 Z) |# _9 V F
int PDMDLLInit()
; a% h. K' i: [% F{ 1 D& G# Z- |3 }/ w+ U, @: B
PTCERROR pdm_status; . r# Q; L {" g5 x. t
FILE *g_pfileLog; g_pfileLog =fopen("test.dat","w"); : f8 i2 m# I( e7 O. I, }' I2 u
setbuf(g_pfileLog,NULL);
5 `- l* Y: J4 o) c/ }( z. j fprintf(g_pfileLog,"begin test\n");
/ Y2 Z7 W: R' `: u4 v- w pdm_status = PDMTriggerRegister(" DMTPIVCreatePostOperation", PDMTPIVCreatePostOperation);
. G9 r$ }, S2 x if (pdm_status != PDM_SUCCESS) 7 |8 `- _; S9 j ~
{ # r6 s* [/ s4 w9 r, K" O/ D1 l/ F
printf("Failed to Register Trigger PIV Create Post.\n");
1 I& B' r7 L1 X& z) j/ I } $ X% q" C' R8 ^; D( r L3 a
return (pdm_status); : ~) b9 J" M3 P0 h& U$ ^6 u% k
}
' t3 J$ c! S& j2 t; R& U& Pint PDMTPIVCreatePostOperation(int argc, void **argv)
- f9 D3 W. ]% M& X{
! T" C; Q3 u1 n( Q5 D$ v" }' a fprintf(g_pfileLog,"test\n");
2 H' K6 n2 [* n$ X& S9 A7 W2 R ..... 2 b' [' P5 `" [' Z
fprintf(g_pfileLog,"end test\n");
1 D* }! D$ T f. O fclose(g_pfileLog); ' s) D+ E! z$ ]. z/ x
}
: Y. z5 Z( ]& [, {7 r5 v 结果:以上代码存在的问题:如果我们在第一次checkin到C/S中后,删除test.dat文件,然后再进行checkin时,发现没有再生成test.dat,在函数PDMTPIVCreatePostOperation()中所进行的对文件的操作都无效.
3 Z$ K% Y( `# G0 a) S. p2 Y 原因:我们使用trigger触发时,真正起作用的是函数 DMTPIVCreatePostOperation(),而PDMDLLInit()只是在第一次checkin时起作用,所以在第一次调用PDMTPIVCreatePostOperation()后,我就fclose(g_pfileLog),所以出现了上面的情况.所以注意的是:不要把一些重要的东西放在函数PDMDLLInit()中. |
|