我要在delphi中调用VC一个名为test的dll,该dll由一个带指针参数的函数组成,我先不执行什么操作,只是弹出一个对话框,可是当我在delphi中调用时,先谈出对话框,表示我调用成功了,然后delphi竟然报错,信息为“无效的指针操作”,大家帮忙看一下吧。
test.h文件为
#define SBook int
extern "C" _declspec(dllexport) bool GetResult(SBook *pBook,int x);test.cpp文件为
#include "stdafx.h"
#include "test.h"extern "C" _declspec(dllexport) bool GetResult(SBook *pBook,int x)
{
MessageBox(NULL,"GetResult函数被调用","提示",MB_OK);
return TRUE;
}
delphi中是这样调用的:typeTGetResult=function(pt:Pointer;x:Integer):boolean; stdcall;
var
Handle:THandle;
GetResult:TGetResult;
pt:Pointer;
flag:integer;
begin
pt:=@flag;
Handle:=LoadLibrary('test.dll'); //将"test.dll"的文件映象映射进调用进程的地址空间
if Handle<>0 then
begin
@GetResult:=GetProcAddress(Handle,'GetResult'); //取得DLL中函数GetResult( )的地址
if @GetResult<>nil then
begin
GetResult(pt,5);
freemem(pt);
end
else
ShowMessage('调用函数"GetProcAddress"时出错!');
FreeLibrary(Handle);
end;end;
test.h文件为
#define SBook int
extern "C" _declspec(dllexport) bool GetResult(SBook *pBook,int x);test.cpp文件为
#include "stdafx.h"
#include "test.h"extern "C" _declspec(dllexport) bool GetResult(SBook *pBook,int x)
{
MessageBox(NULL,"GetResult函数被调用","提示",MB_OK);
return TRUE;
}
delphi中是这样调用的:typeTGetResult=function(pt:Pointer;x:Integer):boolean; stdcall;
var
Handle:THandle;
GetResult:TGetResult;
pt:Pointer;
flag:integer;
begin
pt:=@flag;
Handle:=LoadLibrary('test.dll'); //将"test.dll"的文件映象映射进调用进程的地址空间
if Handle<>0 then
begin
@GetResult:=GetProcAddress(Handle,'GetResult'); //取得DLL中函数GetResult( )的地址
if @GetResult<>nil then
begin
GetResult(pt,5);
freemem(pt);
end
else
ShowMessage('调用函数"GetProcAddress"时出错!');
FreeLibrary(Handle);
end;end;
解决方案 »
- 自己写的控件调用了DLL, 安装没问题, 卸载的时候Delphi每次都崩溃了, 为什么?
- 为什么我用了Pascal的文本文件的操作函之后,程序第一次可以启动,第二次启动时会出现错误?
- SQL语句问题~~大家来帮帮我
- 如何使用WriteProcessMemory函数设置EDIT框中的内容
- 怎么样让焦点移到的时候DBGrid.Columns[1]的picklist自动列出来?
- 求敲击键盘代码!
- 请问在BDE administrator中使用Sql links怎样添加一个和SQLserver数据库连接的别名?
- 请问如何让一个窗体show出来以后,只要不关闭它,一直让他显示在最前面啊? 不能是showmodal的噢!:)
- 动态生成的bmp图怎么在image控件中显示?
- 如何判断输入的字符是数字?
- 100分打听一下 - 有谁知道quickreport 打印设置为何不起作用。
- 想删掉 MEMO 控件里面的所有空格字符,不知道怎么写代码
freemem(pt);pt := @flag; //pt就是flag所处的位置
函数调用完毕flag就会被释放谁创建就谁释放
但pt := @flag;并没有创建资源,只是简单赋值,指向flag的地址
pt: Pointer;
flag: Integer;
begin
pt:=@flag;
freemem(pt);
end;自己测吧,和DLL无关