|
使用toolkit开发trigger的程序时,往往需要能够连续通过trigger来触发dll中的函数. ' L- |; C" B# D9 J% ^% Y
我碰到的问题:
+ X* q6 ^4 W. _1 F' a 1.配置trigger:
5 U% k: m( T8 }5 z3 D" A8 W& } Name: CimDll
& t3 U( }2 q1 s+ d9 T8 X Event: Create PIV 1 Y5 Y- f( a& J( E& m+ Z
Time: POST
' R5 R c. a' R8 t& h% V RequireNO
/ J3 `# C7 l2 y1 @* r: L8 w# i DLL:Cim.dll % b5 e2 i# u. n; \! m! ]4 Y+ a
FunctionDMTPIVCreatePostOperation + d( R/ j" ]4 h6 b# ~
% a- z2 C9 n! Z8 E 2.源代码: : n* o' d x" f. k+ b: a9 w7 S
int PDMDLLInit()
4 a4 f0 N% ` _. ]) d! y5 N{ 1 j' w1 w1 q _( [
PTCERROR pdm_status; ! P3 o/ k( {( a1 |& l; g
FILE *g_pfileLog; g_pfileLog =fopen("test.dat","w"); 2 u, m7 E5 Y X2 P& {1 z8 \
setbuf(g_pfileLog,NULL); 9 z+ x* A! `' D# Z; z
fprintf(g_pfileLog,"begin test\n"); 8 z4 ]* R6 H5 @ y+ |& X7 L
pdm_status = PDMTriggerRegister("DMTPIVCreatePostOperation", PDMTPIVCreatePostOperation); + R7 p& a( p' L2 C0 S
if (pdm_status != PDM_SUCCESS)
) g: Z, I W+ I. ^, \# k { 2 h* e4 q9 @9 [& h3 e
printf("Failed to Register Trigger PIV Create Post.\n");
5 m- L' R* o6 E o0 F3 g9 E9 Y( x' T } - X, h" r$ R* x2 h0 }4 }
return (pdm_status); : c/ a E5 x" f) j T$ h1 I- S7 S8 I
} 7 O" I* j V* W% J
int PDMTPIVCreatePostOperation(int argc, void **argv) " ?1 a9 p" `# z5 i
{
, S/ \1 T! A$ @& F- R q; V fprintf(g_pfileLog,"test\n"); ' X8 j4 O0 v. S3 _/ D; }- x3 r
.....
7 h. h6 h. f6 d fprintf(g_pfileLog,"end test\n");
! N" |8 _+ U" ]- X2 m1 M9 e" | fclose(g_pfileLog);
( `9 \& F8 c% Y, G8 z}
# @# U7 y* D8 f5 x0 r$ B7 ? 结果:以上代码存在的问题:如果我们在第一次checkin到C/S中后,删除test.dat文件,然后再进行checkin时,发现没有再生成test.dat,在函数PDMTPIVCreatePostOperation()中所进行的对文件的操作都无效. v7 i* o. {; H9 A B
原因:我们使用trigger触发时,真正起作用的是函数DMTPIVCreatePostOperation(),而PDMDLLInit()只是在第一次checkin时起作用,所以在第一次调用PDMTPIVCreatePostOperation()后,我就fclose(g_pfileLog),所以出现了上面的情况.所以注意的是:不要把一些重要的东西放在函数PDMDLLInit()中. |
|