|
使用toolkit开发trigger的程序时,往往需要能够连续通过trigger来触发dll中的函数. ! B R0 _3 F9 e, j4 \# @2 T
我碰到的问题: ( P1 s1 Z% U; S5 m1 ^5 e
1.配置trigger:
3 g" [9 d7 }) N+ ^6 |: h h$ S; U Name: CimDll 7 y- @% {; y) ?
Event: Create PIV
+ Y" Z! c0 ^# W* m Time: POST
! _$ C9 e* P5 c8 M" t RequireNO 7 `# f6 n0 _( \ T. s
DLL:Cim.dll ! F8 o, j, \# B# r# A
Function DMTPIVCreatePostOperation # Q2 w8 J& ?! i. E0 @7 R6 T
% t: ^5 A3 h0 z8 M! N- y 2.源代码:
# ~3 Y5 \! V9 d7 e" d+ P int PDMDLLInit()
/ {$ D9 ], l) j V) B6 e- i& @5 H{ 3 z8 j6 L0 B. R! y& A/ ]8 g
PTCERROR pdm_status; 2 J7 Z6 ?1 C: F E% D( Y
FILE *g_pfileLog; g_pfileLog =fopen("test.dat","w");
+ `4 ~3 Q9 b# c, J; G) ~5 O3 @ setbuf(g_pfileLog,NULL); ; L, _" W; G& H" z k4 q! E0 i
fprintf(g_pfileLog,"begin test\n");
/ r8 \5 `' l4 g) T% E9 R7 w pdm_status = PDMTriggerRegister(" DMTPIVCreatePostOperation", PDMTPIVCreatePostOperation);
" Y" z" W5 V: ?& g if (pdm_status != PDM_SUCCESS) - m6 W4 ]4 R* g) R
{ 7 M, X, Q% g; |' y$ X0 L8 _2 H4 n
printf("Failed to Register Trigger PIV Create Post.\n"); / ]/ S4 j- I5 H& ~ A& L" I
} 7 I4 Y5 q0 q* L3 Y' J
return (pdm_status);
; ]5 _8 `! w5 T7 L1 _3 Y} $ e, W8 r7 q& g0 t" e$ H
int PDMTPIVCreatePostOperation(int argc, void **argv) & {% P& B, _$ |- Y4 r3 x
{ / y4 X4 R* I" ]' L: b" w/ `
fprintf(g_pfileLog,"test\n");
$ A. k% u3 s8 U; E1 l: I .....
* C- u3 t" G$ f, o fprintf(g_pfileLog,"end test\n");
% R, B9 {! T ^1 W$ T6 ` fclose(g_pfileLog);
) j: R9 ~; b( m) |}
2 W6 r( O. d/ S5 R0 k; [ 结果:以上代码存在的问题:如果我们在第一次checkin到C/S中后,删除test.dat文件,然后再进行checkin时,发现没有再生成test.dat,在函数PDMTPIVCreatePostOperation()中所进行的对文件的操作都无效.
4 [+ E. L% p0 z# A- `) s/ \; c 原因:我们使用trigger触发时,真正起作用的是函数 DMTPIVCreatePostOperation(),而PDMDLLInit()只是在第一次checkin时起作用,所以在第一次调用PDMTPIVCreatePostOperation()后,我就fclose(g_pfileLog),所以出现了上面的情况.所以注意的是:不要把一些重要的东西放在函数PDMDLLInit()中. |
|