|
使用toolkit开发trigger的程序时,往往需要能够连续通过trigger来触发dll中的函数.
2 L* d7 T& s8 d1 H3 u6 m: K/ Y1 |我碰到的问题:
! \$ i. D& P: u# A/ I. m 1.配置trigger: C% G4 z. z- \5 `
Name: CimDll
2 a' n5 F( M/ m; J; B. _# t- n7 | Event: Create PIV
6 r- H4 U$ f, F' W: u: x4 r8 j1 V Time: POST
& h: O5 x9 g6 T/ y RequireNO
$ f+ O+ b" H6 o+ V' C: m+ ] DLL:Cim.dll 6 f! \ l+ R' Y3 V% [0 a1 ^
FunctionDMTPIVCreatePostOperation
6 B4 A. y# m" b; z0 D5 Q ) @( n1 E5 B' y3 {$ ^6 L, P
2.源代码:
' p3 ^* {# \ Z/ N3 t! J* x int PDMDLLInit()
0 q! [* h( i6 _# n: Y% B J{
7 j) N q( q' u PTCERROR pdm_status; 9 v6 f3 J, A! M' n- g. ?
FILE *g_pfileLog; g_pfileLog =fopen("test.dat","w"); 8 @5 G2 H: Q' G: ?* ^, q5 v
setbuf(g_pfileLog,NULL); 2 G7 t% ^ a( p" p6 J- W' ~
fprintf(g_pfileLog,"begin test\n");
( y3 w3 i" P3 y; I$ l" a/ u0 \ pdm_status = PDMTriggerRegister("DMTPIVCreatePostOperation", PDMTPIVCreatePostOperation); & [+ _6 U6 H5 ?5 x# `
if (pdm_status != PDM_SUCCESS)
8 J6 g2 s4 F9 p8 ^ {
- A1 T1 ~' @$ U/ ^ printf("Failed to Register Trigger PIV Create Post.\n"); & l# m# ?. Q8 d( v C" ~
}
- [7 \( p3 F2 o0 Q. c return (pdm_status);
; B- [7 C! b* }0 W7 A% V} 2 |5 v' N/ n' O9 n2 q8 L7 P+ c- j
int PDMTPIVCreatePostOperation(int argc, void **argv)
5 M& ?% c% x9 O8 n{
0 x& y: P# U+ p0 E m% e fprintf(g_pfileLog,"test\n");
. L' q$ D u; C6 o( R" m& w- L ..... ; P, V% M2 Q% U
fprintf(g_pfileLog,"end test\n"); $ s8 V! F& X& y$ S
fclose(g_pfileLog); * L( i- e+ n8 c6 V7 m) t1 T
}
) |" D9 z7 d; A3 c 结果:以上代码存在的问题:如果我们在第一次checkin到C/S中后,删除test.dat文件,然后再进行checkin时,发现没有再生成test.dat,在函数PDMTPIVCreatePostOperation()中所进行的对文件的操作都无效. 1 o& I7 D+ D6 H$ R+ x
原因:我们使用trigger触发时,真正起作用的是函数DMTPIVCreatePostOperation(),而PDMDLLInit()只是在第一次checkin时起作用,所以在第一次调用PDMTPIVCreatePostOperation()后,我就fclose(g_pfileLog),所以出现了上面的情况.所以注意的是:不要把一些重要的东西放在函数PDMDLLInit()中. |
|