要命了!300分!! delphi调用vc的dll(可变参数) ( 积分: 300 )

  • 主题发起人 主题发起人 tiger
  • 开始时间 开始时间
T

tiger

Unregistered / Unconfirmed
GUEST, unregistred user!
vc dll里的定义
long RunTask(long ntask,char * sinstr,char * soutstr,...);

可变参数...,有没有办法??
 
vc dll里的定义
long RunTask(long ntask,char * sinstr,char * soutstr,...);

可变参数...,有没有办法??
 
function RunTask(long ntask,var sinstr:char;var soutstr:char,...):Long;StdCall;

 
用overload重载呗
 
function RunTask(ntask: integer; var sinstr,soutstr:widestring; ...):integer;
 
var
ntask:integer;
pRcv1:array[0..2000] of Char;
pRcv: array[0..2000] of Char;
begin
..
RunTask(ntask,pRcv+0,pRcv1+0);//调用Vc++的Dll
pRcv[2000]:=#0;
pRcv1[2000]:=#0;

end;

 
function RunTask(ntask: integer; sinstr:pchar;soutstr:pchar; ...):integer;
调用:
var
soutstr:pchar;
getmem(soutstr,255);
RunTask(1,'asasas',soutstr)
...
freemem(soutstr,255);
 
function RunTask(ntask: Integer; sinstr, soutstr: PChar): Integer;cdecl; varargs;

参考下面的
function wsprintf(Output: PChar; Format: PChar): Integer;
cdecl; varargs; external user32 name 'wsprintfA';

procedure TForm1.Button1Click(Sender: TObject);
var
Buf: string;
N: Integer;
begin
N := 64;
SetLength(Buf,1024);
wsprintf(PChar(Buf),'N= %04dd %04xh',N, N);
SetLength(Buf,StrLen(PChar(Buf)));
ShowMessage(Buf);
end;
 
我也自己查了一下,tseug的应该才是正解!
不过程序有问题请tseug帮我看看。

vc的dll头文件
void SetServer(char * RTS_Host,char * RTS_Port);
long RunTask(long ntask,char * sinstr,char * soutstr,...);

采用隐式调用方式 udllload.pas
unit uDllLoad;
interface
function RunTask(ntask:Longint;sinstr:PChar;soutstr:PChar):Longint;cdecl;varargs;
procedure SetServer(RTS_Host:Pchar;RTS_Port:Pchar);cdecl;//如果用stdcall会报错
implementation
function RunTask;external 'tasktool.dll' name 'RunTask';
procedure SetServer;external 'tasktool.dll' name 'SetServer';
end.

主程序部分:
uses uDllLoad;

SetServer(Pchar('192.168.0.100'),PChar('6000'));

程序不报错,但执行无响应(SetServer不通过,还没法试RunTask)


 
从声明上看不出来什么问题, 如果你方便的话可以把那个DLL发给我tseug@263.net 看看
 
function RunTask(ntask:integer;sinstr,soutstr:PChar):integer;Cdecl;

Char* 相当于DELPHI中的PChar.

如果VC的DLL函数声明中无Stdcall,则默认为Cdecl调用方式。

可以参考一下:
我们在DELPHI的DLL中,有一个函数,返回一个字符串,类似的声明如下:
function PowerDllAbout:PChar;stdcall;
而在VC++中相对应的声明如下:
extern "C" _declspec(dllexport) CHAR* PowerDLLAbout()
 
tseug,
已发送,请查收。
 
这里是dll的.def文件,希望高手帮忙看下

enter :

BOOL WINAPI DllEntryPoint(HINSTANCE hDLL,DWORD dwReason,LPVOID Reserved) {

switch(dwReason)
{
case DLL_PROCESS_ATTACH:
{
break;
}
case DLL_PROCESS_DETACH:
{
break;
}
}
return TRUE;
}

exports

; tasktool.def : Declares the module parameters for the DLL.

LIBRARY "tasktool"
DESCRIPTION 'tasktool Windows Dynamic Link Library'

EXPORTS

;SQLD API

;TASKTOOL CLIENT API FUNCTION
SetServer;
RunTask;
 
搞定了,放分罗
 
后退
顶部