用VC++调用delphi编的DLL

firetop818 2007-12-28 12:00:55
dll中的函数是 function computer(x,y,z : integer ) :Tarray ; stdcall ;(其中Tarray = array[0..1] of integer)
我想在VC++中调用dll中函数返回的值 (函数返回一个含有两个元素的数组)
请问用VC++怎么实现,我对VC++不熟,大家最好给出实现的代码
...全文
144 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
firetop818 2007-12-28
  • 打赏
  • 举报
回复
clasj ,这个是我简化后的,我还有些问题请教你,我的QQ 357957918
小呆之家 2007-12-28
  • 打赏
  • 举报
回复
dll中的函数是 function computer(x,y,z : integer ) :Tarray ; stdcall ;(其中Tarray = array[0..1] of integer)
你的这个函数定义得就有问题(参数名没有实际意义就不说了).
为什么不用简单的回调参数呢?
function computer(x,y,z:integer;var resultA,resultB:integer):integer;stdcall;

在VC++中,要返回一个数组不是不可以.
typedef int Tarray[2];

Tarray WINAPI computer(int,int,int);//这是原型,没有实现;
luxuewei5214 2007-12-28
  • 打赏
  • 举报
回复
VC不熟,找个例子看看吧
edongxu 2007-12-28
  • 打赏
  • 举报
回复
事实上,是返回一个指针
clasj 2007-12-28
  • 打赏
  • 举报
回复

//lib.dpr
library lib;

{$R *.res}

type
TArray = array[0..1] of Integer;

function Foo: TArray; stdcall;
begin
Result[0]:=1;
Result[1]:=2;
end;

exports
Foo;

begin
end.

//app.dpr
program app;

{$APPTYPE CONSOLE}

uses
SysUtils;

type
TArray = packed record
Data: array[0..1] of Integer;
end;

function Foo: TArray; stdcall; external 'lib.dll';

var
_Array: TArray;
begin
_Array:=Foo;
WriteLn(_Array.Data[0], ' ', _Array.Data[1]);
ReadLn;
end.


//test.cpp
#include <iostream.h>
#include <windows.h>

#pragma pack(push, 1)
struct TArray {
int Data[2];
TArray(const TArray& Array) {
memcpy(Data, Array.Data, sizeof(Data));
}
};
#pragma pack(pop)

typedef TArray (__stdcall *TFoo)();

int main(int argc, char* argv[])
{
HMODULE hModule = LoadLibrary("lib.dll");
TFoo Foo = (TFoo)GetProcAddress(hModule, "Foo");
TArray Array = Foo();
cout << Array.Data[0] << ends << Array.Data[1] << endl;
cin.get();
return 0;
}

clasj 2007-12-28
  • 打赏
  • 举报
回复
//dll
library lib;

{$R *.res}

type
TArray = array[0..1] of Integer;

function Foo: TArray; stdcall;
begin
Result[0]:=1;
Result[1]:=2;
end;

exports
Foo;

begin
end.

//app
program app;

{$APPTYPE CONSOLE}

uses
SysUtils;

type
TArray = packed record
Data: array[0..1] of Integer;
end;

function Foo: TArray; stdcall; external 'lib.dll';

var
_Array: TArray;
begin
_Array:=Foo;
WriteLn(_Array.Data[0], ' ', _Array.Data[1]);
ReadLn;
end.

//test
#include <iostream.h>
#include <windows.h>

#pragma pack(push, 1)
struct TArray {
int Data[2];
TArray(const TArray& Array) {
memcpy(Data, Array.Data, sizeof(Data));
}
};
#pragma pack(pop)

typedef TArray (__stdcall *TFoo)();

int main(int argc, char* argv[])
{
HMODULE hModule = LoadLibrary("lib.dll");
TFoo Foo = (TFoo)GetProcAddress(hModule, "Foo");
TArray Array = Foo();
cout << Array.Data[0] << ends << Array.Data[1] << endl;
cin.get();
return 0;
}
  • 打赏
  • 举报
回复
delphi的数组和vc的数组没有对应关系.
所以你得改代码了

要么返回一个指针,指向要返回的内容.
要么多传递一个指针参数.
firetop818 2007-12-28
  • 打赏
  • 举报
回复
谢谢红辣椒,请给一个具体的实例
这是我写的代码:
// dllCall.cpp : 以显式方式调用DLL
#include "stdafx.h"
//#include "windows.h"
#include <afxtempl.h>
#include <process.h>

typedef CArray <double,double&> m_Array;
typedef m_Array (*DataToConvert)(double x,double y,double z,double m,double n,double l);

int main(int argc, char* argv[])
{
CArray<double,double&> s_Array;
s_Array.SetSize(3);
//int i;
HINSTANCE hDll; //DLL句柄
DataToConvert DataCov; //函数指针
hDll = LoadLibrary("..\\Debug\\DataConvert.dll");
if (hDll != NULL)
{
printf("success1!\n");
DataCov = (DataToConvert)GetProcAddress(hDll,"DataToConvert");
if(DataCov!=NULL)
{
printf("success2!");
DataCov(20,50,25,0,0,0);
/*printf("success!");*/
}
FreeLibrary(hDll);
}
s_Array.RemoveAll();
return 0;
}

编译没有结果,请问是什么原因

5,391

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧