|
使用toolkit开发trigger的程序时,往往需要能够连续通过trigger来触发dll中的函数.
4 ~* D+ D, F7 E4 L我碰到的问题:
5 {! ?( F7 s% x1 B# Z: T 1.配置trigger:
8 F O8 V L8 i Name: CimDll
, q ?' X. k1 e5 O5 n. ? Event: Create PIV
; w, G7 M. U9 [# e4 D Time: POST
( z9 K; Y3 W! H T5 V/ t2 P RequireNO
; L6 I' h& W2 t! g, E9 W3 ~5 S5 H1 x DLL:Cim.dll
2 N9 l; q% S4 L6 l9 A9 S FunctionDMTPIVCreatePostOperation
) U) J4 g; _3 [; `2 X) C1 \+ I- s
# G5 ^- D: b7 Q. `) _' i: T% O: O 2.源代码:
, o2 I5 Q* s2 G8 H int PDMDLLInit()
8 |+ M; A* R9 D. d% }' l{ ' |4 h h9 G3 {0 b) x
PTCERROR pdm_status; 6 q$ k( U. ~& q! a( k! ^; r4 t
FILE *g_pfileLog; g_pfileLog =fopen("test.dat","w");
% D7 U# t. L% M6 O6 D1 N setbuf(g_pfileLog,NULL); # m+ U4 j' i1 M9 T9 H1 n
fprintf(g_pfileLog,"begin test\n"); : x8 r6 x A0 y. @
pdm_status = PDMTriggerRegister("DMTPIVCreatePostOperation", PDMTPIVCreatePostOperation);
$ m, M6 O% I7 m" ^- H4 G1 j if (pdm_status != PDM_SUCCESS)
* f a i& J4 v6 o/ j { " s: ]4 @% i- X( p! z0 M9 B( ?# J
printf("Failed to Register Trigger PIV Create Post.\n"); ! d- Q9 f2 ]( ^9 O7 \" J! K" ^
}
3 ` V M! q, p$ U' M$ e& s return (pdm_status);
6 Y9 B2 p3 v5 t0 S( L( `1 h}
1 p* ?% e7 O: S. Tint PDMTPIVCreatePostOperation(int argc, void **argv) & B; N9 L3 P6 g3 ?+ ?1 d
{
! |0 U9 I/ G5 F, A) B' l* ? fprintf(g_pfileLog,"test\n"); # `' n1 u3 m- g
.....
9 [# @3 U1 [2 c) G! U/ ? fprintf(g_pfileLog,"end test\n");
0 z. T. h$ @) F fclose(g_pfileLog); ( ^7 g+ h1 h$ f" ]! a1 q& Q
}
]& P @5 V# w0 q5 Z4 _ 结果:以上代码存在的问题:如果我们在第一次checkin到C/S中后,删除test.dat文件,然后再进行checkin时,发现没有再生成test.dat,在函数PDMTPIVCreatePostOperation()中所进行的对文件的操作都无效. H$ g2 Z$ V; Q+ r5 o2 O
原因:我们使用trigger触发时,真正起作用的是函数DMTPIVCreatePostOperation(),而PDMDLLInit()只是在第一次checkin时起作用,所以在第一次调用PDMTPIVCreatePostOperation()后,我就fclose(g_pfileLog),所以出现了上面的情况.所以注意的是:不要把一些重要的东西放在函数PDMDLLInit()中. |
|