|
使用toolkit开发trigger的程序时,往往需要能够连续通过trigger来触发dll中的函数.
) k) F3 G9 v3 T( J& T. D% N我碰到的问题:
" c, V4 v( ~/ s5 @ 1.配置trigger: 4 m# v G, e; P+ H' q/ S' N
Name: CimDll
% f- ^2 y( }- J2 I( k. p& e. ` Event: Create PIV
- x% Y9 k! v4 R: v/ x Time: POST
$ K: l6 m9 ?; a2 ?: b RequireNO 8 D7 J+ Y! g" v' `2 t, r
DLL:Cim.dll
6 e% V# Q- U* C. l8 I$ A Function DMTPIVCreatePostOperation
7 F; B2 D% ^/ X6 w4 U" K) k- W1 ~
; c! R$ p! q$ w; p/ |6 c 2.源代码: % g6 K8 g& g. t1 H
int PDMDLLInit() 4 \) z% |( @, y4 k8 }3 f. y% o
{ 1 C8 \9 i" f1 v: R( o2 h, I
PTCERROR pdm_status;
" E4 ]( h! s) `2 \+ D FILE *g_pfileLog; g_pfileLog =fopen("test.dat","w");
3 m# B9 y+ j" ~# m6 a# j. A setbuf(g_pfileLog,NULL);
2 w7 S5 Z+ P' \* C5 J) Q, h fprintf(g_pfileLog,"begin test\n"); , F% R9 Y7 ^' Z$ s, M" ~
pdm_status = PDMTriggerRegister(" DMTPIVCreatePostOperation", PDMTPIVCreatePostOperation); % q2 u/ Q! a7 e8 L6 s
if (pdm_status != PDM_SUCCESS) ! S/ U) U: W/ @& @
{ 7 X; P5 p; y% j' s( W1 I h" z9 X
printf("Failed to Register Trigger PIV Create Post.\n");
+ `& x: I( K! O+ \( |- x$ Y } $ {# y1 c1 U9 V8 G7 b! b* C: Q
return (pdm_status); 6 b* b* \. i/ A2 x- i
} ; `# m7 h9 m' H: X' l
int PDMTPIVCreatePostOperation(int argc, void **argv) 4 V0 K, u( S& n2 \* E; p& C$ C$ A( A
{ 9 T7 o& _/ r: E# u- z
fprintf(g_pfileLog,"test\n");
1 j' |$ c7 w# q! l ..... , L0 m, W; s$ }( ~
fprintf(g_pfileLog,"end test\n"); : d. `: {, G9 O4 C8 E+ h8 b2 H
fclose(g_pfileLog);
4 l' v& w: T7 v% x}
! t7 d8 a5 ^( j( I: ^& r 结果:以上代码存在的问题:如果我们在第一次checkin到C/S中后,删除test.dat文件,然后再进行checkin时,发现没有再生成test.dat,在函数PDMTPIVCreatePostOperation()中所进行的对文件的操作都无效. $ ]8 b. [- b; |9 |- V
原因:我们使用trigger触发时,真正起作用的是函数 DMTPIVCreatePostOperation(),而PDMDLLInit()只是在第一次checkin时起作用,所以在第一次调用PDMTPIVCreatePostOperation()后,我就fclose(g_pfileLog),所以出现了上面的情况.所以注意的是:不要把一些重要的东西放在函数PDMDLLInit()中. |
|