|
使用toolkit开发trigger的程序时,往往需要能够连续通过trigger来触发dll中的函数. $ v! g% F5 n" Y2 X
我碰到的问题: 5 d8 Z+ i! A+ R- i, o
1.配置trigger:
' _. H) `$ v$ r0 g1 Z9 S Name: CimDll ) @& r7 ^6 y0 h7 y0 {: X
Event: Create PIV
* t3 X) H' C5 H' n) G3 d ` Time: POST
; ~* R5 X; b( l2 ` RequireNO
! ?6 C7 w V& L, c* e3 v( |! z DLL:Cim.dll " b }/ t% l# P
FunctionDMTPIVCreatePostOperation
- m' |: m' `+ I6 \4 U. G. X 4 \( K7 s& C* P. w; u. [4 W, q
2.源代码: & e5 b! V8 ^; D+ b& h
int PDMDLLInit() m) Z1 d7 G ^/ c3 m4 @4 y
{ z R: Y; A/ |
PTCERROR pdm_status;
2 j% g0 M7 d/ h' m FILE *g_pfileLog; g_pfileLog =fopen("test.dat","w"); / C: `8 G) B6 I* |1 O
setbuf(g_pfileLog,NULL); 9 \8 C5 N) D: m! _$ K5 \6 B3 M1 P
fprintf(g_pfileLog,"begin test\n");
, }; q: x2 T7 O" P pdm_status = PDMTriggerRegister("DMTPIVCreatePostOperation", PDMTPIVCreatePostOperation);
: E( r- _% R9 ~' `: ]. j if (pdm_status != PDM_SUCCESS)
5 v* g. Y0 O. c7 y" ~ { ' ?: H7 ?4 Q" e# \8 |
printf("Failed to Register Trigger PIV Create Post.\n"); 7 F% K' s) k/ {
}
; v; a9 N( x9 ?$ ]3 _! Z5 ? return (pdm_status);
9 O Y3 K, f2 ?& y3 E( k# y* l} 8 U8 C X# n5 q1 a' o
int PDMTPIVCreatePostOperation(int argc, void **argv) 2 R2 p' ^4 [, `) p
{ & i8 S6 q! W/ a; X$ t
fprintf(g_pfileLog,"test\n"); + i. I$ U# ^& a% g2 n; [+ a2 R
..... # H4 v9 h. h$ {7 d
fprintf(g_pfileLog,"end test\n"); % f: T* |$ i( |
fclose(g_pfileLog); 6 z" ]7 K6 B( v
}
2 x' t% i' S. n o- j$ G) F5 p% x 结果:以上代码存在的问题:如果我们在第一次checkin到C/S中后,删除test.dat文件,然后再进行checkin时,发现没有再生成test.dat,在函数PDMTPIVCreatePostOperation()中所进行的对文件的操作都无效. 6 o' }4 t; S0 S( H: L, m
原因:我们使用trigger触发时,真正起作用的是函数DMTPIVCreatePostOperation(),而PDMDLLInit()只是在第一次checkin时起作用,所以在第一次调用PDMTPIVCreatePostOperation()后,我就fclose(g_pfileLog),所以出现了上面的情况.所以注意的是:不要把一些重要的东西放在函数PDMDLLInit()中. |
|