|
使用toolkit开发trigger的程序时,往往需要能够连续通过trigger来触发dll中的函数.
" e9 B) j" W9 a- V/ r* P/ T我碰到的问题: - }$ S+ Z8 k7 M0 _8 ?* Z
1.配置trigger:
+ m+ A; d+ |' g- `/ c2 p# R1 [ Name: CimDll
4 a7 Z% @6 t9 K0 z1 C Event: Create PIV 5 D" m0 m& C4 B5 J- z
Time: POST
5 v: q6 _: O( @" c5 I3 D" c RequireNO
8 {$ S3 X1 o+ ] DLL:Cim.dll
. W3 G3 }" B# f" ~- w" g Function DMTPIVCreatePostOperation
* C6 p1 h9 [2 M: B# b$ X; r: O & W9 O7 `+ W' L! r$ l, s% `( B
2.源代码: ' v, V# F" ?" W8 h) C
int PDMDLLInit() . y0 _+ A C4 o) Q- T9 y' b
{
: C) I f, _+ y, D& f# v$ o PTCERROR pdm_status;
0 O# o* r P0 o( r8 k, {; W1 s FILE *g_pfileLog; g_pfileLog =fopen("test.dat","w"); 5 ]' g; J- b1 z5 {) j
setbuf(g_pfileLog,NULL);
/ @0 M7 Z# h0 ^& u. q5 Z5 d; c fprintf(g_pfileLog,"begin test\n");
0 W' E1 G) q/ {, W T: f: N) F7 N pdm_status = PDMTriggerRegister(" DMTPIVCreatePostOperation", PDMTPIVCreatePostOperation); * {! H- K. u4 g8 m. k
if (pdm_status != PDM_SUCCESS)
2 N7 D- b0 h% c% R* a+ \ { 0 F' U @+ D, d( L4 p8 o6 M
printf("Failed to Register Trigger PIV Create Post.\n");
; B5 {: n8 B9 E8 F- X" W6 v }
3 c$ ]8 t! T2 l7 `: t; w return (pdm_status);
4 \% C2 i, J; T( e: b1 s} 6 A4 [: ]/ H+ g
int PDMTPIVCreatePostOperation(int argc, void **argv)
5 f, {2 V( C3 q- G' n2 r4 s: [2 c{
- x/ s& f5 t7 p! q fprintf(g_pfileLog,"test\n"); , j N/ p H, \0 e: p( l! @
.....
% [8 ]" A3 \. P fprintf(g_pfileLog,"end test\n"); # T, r3 j# b+ Y( w8 ]. _
fclose(g_pfileLog); * v7 n) M. K! O7 X6 O
} . k+ S$ b9 v8 y% T$ a
结果:以上代码存在的问题:如果我们在第一次checkin到C/S中后,删除test.dat文件,然后再进行checkin时,发现没有再生成test.dat,在函数PDMTPIVCreatePostOperation()中所进行的对文件的操作都无效. 5 E+ U" _1 I1 d6 S
原因:我们使用trigger触发时,真正起作用的是函数 DMTPIVCreatePostOperation(),而PDMDLLInit()只是在第一次checkin时起作用,所以在第一次调用PDMTPIVCreatePostOperation()后,我就fclose(g_pfileLog),所以出现了上面的情况.所以注意的是:不要把一些重要的东西放在函数PDMDLLInit()中. |
|