
TCFADODBStorage.OpenConnection:
Boolean
//线程里打开ADOConnection,在XP下切换输入法程序会死掉
//原因:ADO自动创建一个ADODB.AsyncEventMessenger窗口,然后会有一个对应的IME窗口,但线程里没有消息循环
//
XP下输入法切换时会SendMessage给IME窗口并等待返回,IME窗口并不会处理消息,造成死锁
//这个函数把线程里的IME窗口释放掉,切换输入法时就不会有消息过来了
procedure
_FreeIMEWindow
const
IME_WINDOW_CLASS
=
'IME'
IME_WINDOW_TEXT
=
'Default
IME'
var
h
:
HWND
pid
:
DWORD
dh
:
HWND
begin
h
:=
FindWindow(IME_WINDOW_CLASS,
IME_WINDOW_TEXT)
while
IsWindow(h)
do
begin
if
GetWindowThreadProcessId(h,
pid)
=
GetCurrentThreadId
then
dh
:=
h
else
dh
:=
0
h
:=
FindWindowEx(0,
h,
IME_WINDOW_CLASS,
IME_WINDOW_TEXT)
if
dh
<>
0
then
DestroyWindow(dh)
end
endbegin
try
FConnection.ConnectionString
:=
ConnectionString
FConnection.Connected
:=
True
if
GetCurrentThreadId
<>
Global.MainThreadID{全局的主线程ID,如果是主线程,不需要Free}
then
_FreeIMEWindow
except
on
E:
Exception
do
FLastErrorMessage
:=
e.Message
end
Result
:=
FConnection.Connectedend
[解决办法]
线程中要加入消息条件退出语句,这样才不能无限循环(假死)。
本文来自:读书人网(http://www.reader8.cn/)原文链接:http://www.reader8.cn/jiaocheng/20130711/2169937.html
var MyAccess: TAccessApplication//要加入access FileName: WideString//************************ var ADOConnection:TADOConnection//这个语句一定要加入adoconnection控件 ,或者要加入uses adodbADOQuery:TADOQuerytemppath:string//存放临时目录 tb:boolean//检查文件是否存在 begin try //首先判断是否有这个数据库 tb:= fileexists(edit1.Text )if tb then exit//如果数据库存在就退出 MyAccess := TAccessApplication.Create(Self)// myaccess.CloseCurrentDatabase //close database engin FileName := edit1.Text //如果路径不存在,程序不会自动创建 MyAccess.NewCurrentDatabase(FileName)myaccess.CloseCurrentDatabaseMyAccess.DisconnectMyAccess.Free//以上建库完毕 ,下面开始创建表和字段欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)