首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

DLL动态调用,该怎么解决

2012-03-05 
DLL动态调用 - C++ Builder / Windows SDK/APIHINSTANCE PcommDLL NULLbool LoadPcommDll(){try{PcommD

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
{
//失败
}

热点排行