|
使用toolkit开发trigger的程序时,往往需要能够连续通过trigger来触发dll中的函数. / U3 l' f" v6 @( `2 M4 N- U! M
我碰到的问题: 2 L! u; s1 b8 U2 ?' B( x
1.配置trigger:
- b# x* l3 H/ t7 } Name: CimDll % `( P$ O" Y1 {7 M' Z$ j1 d
Event: Create PIV 1 {/ F9 n9 M7 q) B- d) _: {. {
Time: POST
) K% v' ?3 o5 ?" E RequireNO
9 n1 h5 s: a8 v! j% r3 O DLL:Cim.dll - U6 W% f# i4 {9 {" t, Y7 [' c" |) i) ^
FunctionDMTPIVCreatePostOperation 6 u3 |% {$ B4 S- i# j& d
1 _8 y2 `7 q! R% s1 V5 c; {; B3 r3 m
2.源代码: / Z+ Y* h( ~3 Q
int PDMDLLInit() " X- }" ^: }1 P5 ]# g- `, A: r
{ # ~: d5 c3 R( p2 j6 G- y. t& ?
PTCERROR pdm_status;
$ t4 ~- H# o( P2 F FILE *g_pfileLog; g_pfileLog =fopen("test.dat","w"); 4 ~( h' s# H5 W
setbuf(g_pfileLog,NULL); 6 ^+ g: F& l( ~& p5 |" O
fprintf(g_pfileLog,"begin test\n");
* e. N7 {8 E7 y/ ~0 W0 Z pdm_status = PDMTriggerRegister("DMTPIVCreatePostOperation", PDMTPIVCreatePostOperation); ! [7 d+ z# h {) Q2 Y2 R
if (pdm_status != PDM_SUCCESS) * D* ]/ o" ^8 F& c# b
{ " p4 Q% Y \5 k" m% L1 S
printf("Failed to Register Trigger PIV Create Post.\n");
5 M& E* J* k1 u S2 b, b" j+ Y }
4 Q, J. |' @2 }* U" g& A+ ^( ? return (pdm_status); 5 U1 S3 ]- M! z4 \5 W4 \, B
}
0 g0 d! m- C: tint PDMTPIVCreatePostOperation(int argc, void **argv) 4 W0 m8 q! k9 W' B
{
\. {; @& {2 c& W9 h fprintf(g_pfileLog,"test\n"); 4 X7 j' r v I6 M0 ?
..... - @0 N" j4 o7 Y8 _, @) F- H
fprintf(g_pfileLog,"end test\n"); 7 V) K% a$ r1 w8 x
fclose(g_pfileLog); - i; ~4 T/ L% L1 x K) d
}
$ {+ t/ X1 E6 }7 p 结果:以上代码存在的问题:如果我们在第一次checkin到C/S中后,删除test.dat文件,然后再进行checkin时,发现没有再生成test.dat,在函数PDMTPIVCreatePostOperation()中所进行的对文件的操作都无效. 4 J1 c/ a+ A4 X y( l" S2 z
原因:我们使用trigger触发时,真正起作用的是函数DMTPIVCreatePostOperation(),而PDMDLLInit()只是在第一次checkin时起作用,所以在第一次调用PDMTPIVCreatePostOperation()后,我就fclose(g_pfileLog),所以出现了上面的情况.所以注意的是:不要把一些重要的东西放在函数PDMDLLInit()中. |
|