用bcb5建立dll文件,内容如下:
//---------------------------------------------------------------------------#include "vcl.h"
#include <windows.h>#pragma argsused
extern "C" __declspec(dllexport) void test(int i);
extern "C" __declspec(dllexport) void test1(char *str);int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------
void test(int i)
{
MessageBox(NULL,"test function in the dll begin!","",MB_OK);
};void test1(char *str)
{
MessageBox(NULL,str ,"",MB_OK);
}编译成test.dll,成功。在delphi6中调用其中的test1函数,采用静态调用的方式:
声明如下:
procedure _test(str:pchar);far; external 'test.dll';调用的语句如下:
_test('okok');
可是运行的结果,test1函数中的信息窗口显示的是随机的字符串!!并不是'okok' 采用动态调用的方式结果也一样。曾想用bcb中采用动态调用的方式调用test1函数,但不知道怎么声明,我测试调用一个不带参数的dll中的函数,成功了,但带参数带用怎么写呢?
以下是调用不带参数的dll中的函数。结果是可以的。
HANDLE hLibrary;
FARPROC lpFunc;
int i; hLibrary=LoadLibrary("test.dll"); //加载DLL
if((int)hLibrary>31) //加载成功
{
lpFunc=GetProcAddress(hLibrary,"_test"); //检取函数地址
if(lpFunc!=(FARPROC)NULL) //检取成功则调用
i=(*lpFunc)();
Label1->Caption =IntToStr(i);
FreeLibrary(hLibrary); //释放占用的内存
}
//---------------------------------------------------------------------------#include "vcl.h"
#include <windows.h>#pragma argsused
extern "C" __declspec(dllexport) void test(int i);
extern "C" __declspec(dllexport) void test1(char *str);int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------
void test(int i)
{
MessageBox(NULL,"test function in the dll begin!","",MB_OK);
};void test1(char *str)
{
MessageBox(NULL,str ,"",MB_OK);
}编译成test.dll,成功。在delphi6中调用其中的test1函数,采用静态调用的方式:
声明如下:
procedure _test(str:pchar);far; external 'test.dll';调用的语句如下:
_test('okok');
可是运行的结果,test1函数中的信息窗口显示的是随机的字符串!!并不是'okok' 采用动态调用的方式结果也一样。曾想用bcb中采用动态调用的方式调用test1函数,但不知道怎么声明,我测试调用一个不带参数的dll中的函数,成功了,但带参数带用怎么写呢?
以下是调用不带参数的dll中的函数。结果是可以的。
HANDLE hLibrary;
FARPROC lpFunc;
int i; hLibrary=LoadLibrary("test.dll"); //加载DLL
if((int)hLibrary>31) //加载成功
{
lpFunc=GetProcAddress(hLibrary,"_test"); //检取函数地址
if(lpFunc!=(FARPROC)NULL) //检取成功则调用
i=(*lpFunc)();
Label1->Caption =IntToStr(i);
FreeLibrary(hLibrary); //释放占用的内存
}
解决方案 »
- 动态创建上万个图标
- 重分苦求事件运行过程图代码或者思路也行
- 可以读写的游标怎么定义的?
- 分享windows2000及以上OS下判断USB盘的方法----API应用(感谢LY提供支持)
- -------求教:关于如何访问远程SQL数据库问题-------
- 指针----文件?
- 四海之内皆朋友____我的理想!QQ:148376738
- CSDN这段时间有Bug么???为什么别人给我结贴而我的专家分却没有加?
- 急,清华版《Delphi构建进销存系统——POS系统开发实例>>安装其中控件的问题!
- 一个关于窗口的简单问题(50分)
- 两个分别上网的电脑如何相互通过程序相互收发数据???
- 如何将网页中参数传到ActiveX Form (ocx控件)?
extern "C" void __declspec(dllexport) __stdcall test(int i);
extern "C" void __declspec(dllexport) __stdcall test1(char *str);
在delphi中也用stdcall方式;
然后test(pchar('okok'));
肯定可以的。
你这样不行,是因为声明的方式不同造成的。
如果不改动态库,你调用时用cdecl可以试一下。
哎!这些天忙的头都晕了,这么基础的知识都不敢确定了。
extern "C" void __declspec(dllexport) __stdcall test(int i);
extern "C" void __declspec(dllexport) __stdcall test1(char *str);