VC写动态库:
extern "C" __declspec( dllexport ) void SetValue( BOOL bHook )
{
g_bHook = bHook;
if( bHook ){
AfxMessageBox( "TRUE " );
}
else {
AfxMessageBox( "FALSE" );
}
}Delphi调用:
1. 静态调用
procedure SetValue( bHook : boolean ) ;stdcall;external testdll.dll';
2. 动态加载
type TFunction = procedure( bHook : boolean );var
fun : Tfunction;
Hinst : Thandle;
Begin
Hinst := LoadLibrary( ‘testdll.dll’ );
@fun := GetProcAddress( Hinst, PCHAR(‘SetValue’) );
end;
当我调用fun( true ) 和 fun(false)时,在动态库中都会弹出’TRUE’的对话框(AfxMessageBox( "TRUE " );),即传递到动态库的参数好象总是true。但我用静态调用时,会正确传递参数,但delphi程序会报异常哦!!!
extern "C" __declspec( dllexport ) void SetValue( BOOL bHook )
{
g_bHook = bHook;
if( bHook ){
AfxMessageBox( "TRUE " );
}
else {
AfxMessageBox( "FALSE" );
}
}Delphi调用:
1. 静态调用
procedure SetValue( bHook : boolean ) ;stdcall;external testdll.dll';
2. 动态加载
type TFunction = procedure( bHook : boolean );var
fun : Tfunction;
Hinst : Thandle;
Begin
Hinst := LoadLibrary( ‘testdll.dll’ );
@fun := GetProcAddress( Hinst, PCHAR(‘SetValue’) );
end;
当我调用fun( true ) 和 fun(false)时,在动态库中都会弹出’TRUE’的对话框(AfxMessageBox( "TRUE " );),即传递到动态库的参数好象总是true。但我用静态调用时,会正确传递参数,但delphi程序会报异常哦!!!
解决方案 »
- 调用FONT设置
- Excel复制、粘贴问题
- 问一个简单问题?cxExportGrid4Link是不是控件啊?在哪里啊??
- 谁能帮帮我~~~我没有corba data module 应该怎么添加呢???
- 为什么用ExpressQuantumGrid 5导出到excel时,在excel中不能进行单元格计算?
- 向大家请教:如何用Delphi控制Word生成表格和插入图片?
- delphi+apache的问题???
- 关于fastreport中打印自定义变量的问题
- 哪里有Delphi 5 开发人员指南里面的范例程序?
- 怎样让TWebBrowser向需要接收表单元素的页面发表单数据?(怎样Post)?
- 小问题,这个能做出来吗?
- 哪本书详细讲到FindFirst和FindNext查找文件???
C里的BOOL类型是四个字节
类型要一致
procedure SetValue( bHook : BOOL) ;stdcall;external testdll.dll';type TFunction = procedure( bHook : BOOL); stdcall;
静态需要加上stdcall;
在type的时候,加上stdcall,也会像静态调用一样,报错!!!
procedure SetValue(bHook: BOOL); stdcall; external 'testdll.dll';procedure TForm1.Button1Click(Sender: TObject);
type
TFunction = procedure(bHook: BOOL); stdcall;
var
fun: TFunction;
Hinst: THandle;
begin
SetValue(False);
SetValue(True); Hinst := LoadLibrary('testdll.dll');
if Hinst = 0 then
begin
ShwoMessage('载入testdll.dll失败');
Exit;
end;
@fun := GetProcAddress(Hinst, PChar('SetValue'));
if Assigned(fun) then
begin
fun(False);
fun(True);
end else ShowMessage('没有找到SetValue函数');
FreeLibrary(Hinst);
end;
{
...
...
}2.楼上检查用下,编译出来的dll输出的函数名,是不否正确,
一般来说,函数通过关键字__declspec(dllexport)导出,会发生函数名的变化3.VC编译的DLL,给delphi用,最好还是用DEF吧如void WINAPI SetValue( BOOL bHook )
{
g_bHook = bHook;
if( bHook ){
AfxMessageBox( "TRUE " );
}
else {
AfxMessageBox( "FALSE" );
}
}然后写def文件LIBRARY DllEXPORTS
SetValue具体参考:http://www.cnsdn.com.cn/inc/show.asp?id=2510