读书人

DLL动态调用,该怎么解决

发布时间: 2012-03-05 11:54:01 作者: rapoo

DLL动态调用 - C++ Builder / Windows SDK/API
HINSTANCE PcommDLL = NULL;
bool LoadPcommDll()
{
try
{
PcommDLL=LoadLibrary("Pcomm.dll");
if(PcommDLL)
{
//LED_Open =(long(WINAPI *)(TDeviceParam*,long,long,long))GetProcAddress(LEDDLL,"LED_Open");
sio_ioctl=(int (WINAPI *)(int port, int baud, int mode))GetProcAddress(PcommDLL,"sio_ioctl");
sio_getch=(int (WINAPI *)(int port))GetProcAddress(PcommDLL,"sio_getch");
sio_read=(int (WINAPI *)(int port, char *buf, int len))GetProcAddress(PcommDLL,"sio_read");
sio_putch=(int (WINAPI *)(int port, int term))GetProcAddress(PcommDLL,"sio_putch");
sio_write=(int (WINAPI *)(int port, char *buf, int len))GetProcAddress(PcommDLL,"sio_write");
sio_flush=(int (WINAPI *)(int port, int func))GetProcAddress(PcommDLL,"sio_flush");
sio_iqueue=(long (WINAPI *)(int port))GetProcAddress(PcommDLL,"sio_iqueue");
sio_oqueue=(long (WINAPI *)(int port))GetProcAddress(PcommDLL,"sio_oqueue");
sio_lstatus=(int (WINAPI *)(int port))GetProcAddress(PcommDLL,"sio_lstatus");
sio_lctrl=(int (WINAPI *)(int port, int mode))GetProcAddress(PcommDLL,"sio_lctrl");
sio_cnt_irq=(int (WINAPI *)(int port, VOID (CALLBACK *func)(int port), int count))GetProcAddress(PcommDLL,"sio_cnt_irq");
sio_modem_irq=(int (WINAPI *)(int port, VOID (CALLBACK *func)(int port)))GetProcAddress(PcommDLL,"sio_modem_irq");
sio_break_irq=(int (WINAPI *)(int port, VOID (CALLBACK *func)(int port)))GetProcAddress(PcommDLL,"sio_break_irq");
sio_Tx_empty_irq=(int (WINAPI *)(int port, VOID (CALLBACK *func)(int port)))GetProcAddress(PcommDLL,"sio_Tx_empty_irq");
sio_break=(int (WINAPI *)(int port, int time))GetProcAddress(PcommDLL,"sio_break");
sio_break_ex=(int (WINAPI *)(int port, int time))GetProcAddress(PcommDLL,"sio_break_ex");
sio_flowctrl=(int (WINAPI *)(int port, int mode))GetProcAddress(PcommDLL,"sio_flowctrl");
sio_Tx_hold=(int (WINAPI *)(int port))GetProcAddress(PcommDLL,"sio_Tx_hold");
sio_close=(int (WINAPI *)(int port))GetProcAddress(PcommDLL,"sio_close");
sio_open=(int (WINAPI *)(int port))GetProcAddress(PcommDLL,"sio_open");
return true;
}
else
return false;
}
catch(...)
{
//
}

}

上面的函数无论是不是成功加载PCOMM.DLL,函数都返回true
就是把PCOMM文件删除了,还是返回TRUE?
为什么这样啊?


[解决办法]
Long,成功则返回库模块的句柄,零表示失败。会设置GetLastError
HInst = LoadLibrary("IsupGW.dll");
if (HInst ==0)
{
::AfxMessageBox("Load vaSS7GWISUP.dll Failed!!!");
::TerminateProcess(GetCurrentProcess(),0);
return false;
}

[解决办法]
Pcomm.dll文件有可能在其它的系统文件夹里,虽然你在当前目录中删除了,但程序在其它地方找到了该文件也说不好啊.因为加载动态库的机制是在当前路径下找,找不到再到各个系统文件夹里去找.你试试将文件名换一个不存在的文件试试,如果返回false就证明我的猜想,否则那就是其它问题了.
[解决办法]
PcommDLL=LoadLibrary("Pcomm.dll");
if(PcommDLL!=NULL)
{
...
}else
{
//失败
}

读书人网 >C++ Builder

热点推荐