C++Builder 写的一个动态库,对应函数,
如下: extern "C" __declspec(dllexport) int __stdcall GetPIDByCardNo( char* sCardNo, char* sPID, char* sErr ); VC2008中在控制台程序上可以调用,程序如下:
typedef int ( _stdcall *GetPIDByCardNoFunc )( char *, char *, char * );int main()
{
char sCardNo[18];
char sPID[20];
char sErr[100];
memset( sCardNo, 0x00, sizeof( sCardNo ) );
memset( sPID, 0x00, sizeof( sPID ) );
memset( sErr, 0x00, sizeof( sErr ) );
strncpy( sCardNo, "87109823", sizeof( sCardNo ) - 1 ); GetPIDByCardNoFunc _GetPIDByCardNoFunc ;
HINSTANCE hInstLibrary = LoadLibrary(L"KCPIDNO.dll");
if (hInstLibrary == NULL)
{
FreeLibrary(hInstLibrary);
}
else
{
} _GetPIDByCardNoFunc = (GetPIDByCardNoFunc)GetProcAddress( hInstLibrary, "GetPIDByCardNo" );
if ( _GetPIDByCardNoFunc == NULL )
{
FreeLibrary( hInstLibrary ); //释放
}
else
{
_GetPIDByCardNoFunc( sCardNo, sPID, sErr );
cin.get(); FreeLibrary(hInstLibrary); // 调用完后,要释放内存。
}
}
同样的调用程序将其放到 ActiveX工程中就出现 GetProcAdrress 返回 GetPIDByCardNoFunc 值为 NULL??
这是怎么回事呢???
拜求指点。谢谢!!!??
如下: extern "C" __declspec(dllexport) int __stdcall GetPIDByCardNo( char* sCardNo, char* sPID, char* sErr ); VC2008中在控制台程序上可以调用,程序如下:
typedef int ( _stdcall *GetPIDByCardNoFunc )( char *, char *, char * );int main()
{
char sCardNo[18];
char sPID[20];
char sErr[100];
memset( sCardNo, 0x00, sizeof( sCardNo ) );
memset( sPID, 0x00, sizeof( sPID ) );
memset( sErr, 0x00, sizeof( sErr ) );
strncpy( sCardNo, "87109823", sizeof( sCardNo ) - 1 ); GetPIDByCardNoFunc _GetPIDByCardNoFunc ;
HINSTANCE hInstLibrary = LoadLibrary(L"KCPIDNO.dll");
if (hInstLibrary == NULL)
{
FreeLibrary(hInstLibrary);
}
else
{
} _GetPIDByCardNoFunc = (GetPIDByCardNoFunc)GetProcAddress( hInstLibrary, "GetPIDByCardNo" );
if ( _GetPIDByCardNoFunc == NULL )
{
FreeLibrary( hInstLibrary ); //释放
}
else
{
_GetPIDByCardNoFunc( sCardNo, sPID, sErr );
cin.get(); FreeLibrary(hInstLibrary); // 调用完后,要释放内存。
}
}
同样的调用程序将其放到 ActiveX工程中就出现 GetProcAdrress 返回 GetPIDByCardNoFunc 值为 NULL??
这是怎么回事呢???
拜求指点。谢谢!!!??
VC中无LIB时的DLL隐式链接,制作与VC++相符合的LIB函数符号输入库(转)请大家注意!这种方法只能应用于输出为C格式的__stdcall调用方式!
1.使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件
EXAMPLE:
DUMPBIN VideoDeCoder.dll /EXPORTS /OUT:VideoDeCoder.def
2.将导出的.DEF文件整理为一符合.DEF个数的函数导出文件(整理过程巨乱巨复杂,懒得举例了,后面有简便方法^_^)
3.使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.
EXAMPLE:
LIB/DEF:VideoDeCoder.def /MACHINE:IX86
4.连接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错:
error LNK2002:unresolved external symbol "functionname@nn"
提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立LIB,重新链接即可.
这样就制作成功了符合VC调用方式的LIB了!要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,这种方法只能应用于输出为C格式的__stdcall调用方式,只要做一点点修改就可以成为符合VC的DEF文件!
IMPDEF xxx.def xxx.dll
只要将BCB的DEF文件中函数申明格式转换为vc识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误!
vc调用bcb的我没试过,不过可以参照上面的格式自己改改好了:)
我还是给你贴个 我自己做的例子吧//C++Builder dll CPP
#pragma argsused
extern "C" _declspec(dllexport) int __stdcall CircleArea(int r);
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------
int __stdcall CircleArea(int r)
{
int s =r+100 ;
return s;
}
//--------------------------------------------------------------
//VC 调用部分
void CLocalDllDlg::OnButton1()
{
// TODO: Add your control notification handler code here
// TODO: 在此添加控件通知处理程序代码
HINSTANCE hDllInst = LoadLibrary("Project1.dll");
if(hDllInst)
{
typedef int(_stdcall *CircleArea)(int r) ;
CircleArea youFuntionNameAlias = (CircleArea)GetProcAddress(hDllInst,"CircleArea");
// youFuntionName 在DLL中声明的函数名
if(youFuntionNameAlias)
{
CString a ;
a.Format("%d",youFuntionNameAlias(10));
MessageBox(a);
}
else
{
MessageBox("No");
}
}
FreeLibrary(hDllInst);
}
最后再用 javascript 调用 ActiveX 相关方法。现在整个项目已经验收了!
非常非常感谢!