gpt4 book ai didi

delphi - 用字符串从delphi调用c dll

转载 作者:行者123 更新时间:2023-12-03 15:47:49 25 4
gpt4 key购买 nike

我正在尝试从 Delphi XE5 调用 dll。

我花了一天左右的时间在谷歌上搜索“从 Delphi 调用 C DLL”之类的内容,找到了很多页面,但没有任何内容真正对我有帮助。

我收到了如何在 VB 中调用 dll 的示例:

<小时/>
Declare Function IxCommand Lib "IxxDLL.dll" (ByVal command As String, ByVal mailbox As String) As Integer

...

Sub Command1_Click ()
Dim command As String * 135
Dim mailbox As String * 135

command = "move:a,1000"
IxCommand( command, mailbox)
End Sub
<小时/>

同样在VC 6.0中调用DLL:

<小时/>
#include "stdafx.h"

#include "windows.h"
#include "stdio.h"
#include "string.h"

typedef UINT (CALLBACK* LPFNIXDLLFUNC)(char *ixstr, char *mbstr);

int main(int argc, char* argv[])
{
HINSTANCE hDLL; // Handle to DLL
LPFNIXDLLFUNC lpfnIxDllFunc; // Function pointer

hDLL = LoadLibrary( "IxxDLL.dll" );

if (hDLL == NULL) // Fails to load Indexer LPT
{
printf("Can't open IxxDLL.dll\n");
exit(1);
}
else // Success opening DLL - get DLL function pointer
{
lpfnIxDllFunc = (LPFNIXDLLFUNC)GetProcAddress(hDLL, "IxCommand");
}

printf( "Type Indexer LPT command and press <Enter> to send\n" );
printf( "Type \"exit\" and press <Enter> to quit\n\n" );

while( 1 )
{
char ix_str[135]; // String to be sent to Indexer LPT
char mailbox_str[135]; // Results from call into Indexer LPT

gets( ix_str ); // Get the string from the console
if( _stricmp( ix_str, "exit" ) == 0 ) // Leave this program if "exit"
break;
lpfnIxDllFunc( ix_str, mailbox_str ); // Otherwise call into Indexer LPT
printf( "%s\n\n", mailbox_str ); // Print the results
}

FreeLibrary( hDLL );
return 0;
}
<小时/>

我注意到一个复杂的问题是需要在调用 DLL 之前定义内存分配的大小,如上所示。

dll 在第一个参数中接受命令,并在第二个参数中返回结果文本。

这是我生成的用于尝试调用 DLL 的 Delphi 代码。我知道 dll 会加载,因为它有一个显示的启动屏幕。当我调用dll时没有产生错误。您将看到我使用数组来分配空间,然后将它们的位置分配给 Pchar 变量。我没有原始dll的任何头文件,也没有源代码。您将看到我使用 stdcall 声明了外部函数,但我也尝试了 cdecl,没有任何更改。

问题: arg2 中返回的信息不是预期的文本字符串,而是翻译为非英语字符的字符串(看起来像中文)。

我猜我没有向 dll 发送正确的变量类型。

问题:任何人都可以帮助我制定外部函数的声明并正确使用它,以便我根据需要返回文本字符串吗?

见下文:

<小时/>
function IxCommand (command : PChar; mailbox : PChar) : Integer; stdcall; external 'IxxDLL.dll';

...

procedure TfrmXYZ.btn1Click(Sender: TObject);

var
LocalResult : Integer;
arg1,
arg2 : PChar;


ArrayStrCmd : array[0..134] of char;
ArrayStrMbx : array[0..134] of char;

begin

ArrayStrCmd := 'Accel?:a' + #0;
ArrayStrMbx := ' ' + #0;
arg1 := @ArrayStrCmd;
arg2 := @ArrayStrMbx;


LocalResult := IxCommand(arg1, arg2);

end;
<小时/>

最佳答案

问题是字符编码。在 Delphi 2009+ 中,PCharPWideChar 的别名,但 DLL 使用 Ansi 字符串代替,因此您需要使用 PAnsiChar 代替PChar

试试这个:

function IxCommand (command : PAnsiChar; mailbox : PAnsiChar) : Integer; stdcall; external 'IxxDLL.dll';

...

procedure TfrmXYZ.btn1Click(Sender: TObject);
var
LocalResult : Integer;
ArrayStrCmd : array[0..134] of AnsiChar;
ArrayStrMbx : array[0..134] of AnsiChar;
begin
ArrayStrCmd := 'Accel?:a' + #0;
LocalResult := IxCommand(ArrayStrCmd, ArrayStrMbx);
end;

或者:

function IxCommand (command : PAnsiChar; mailbox : PAnsiChar) : Integer; stdcall; external 'IxxDLL.dll';

...

procedure TfrmXYZ.btn1Click(Sender: TObject);
var
LocalResult : Integer;
ArrayStrCmd,
ArrayStrMbx : AnsiString;
begin
SetLength(ArrayStrCmd, 135);
StrPCopy(ArrayStrCmd, 'Accel?:a');
SetLength(ArrayStrMbx, 135);
LocalResult := IxCommand(PAnsiChar(arg1), PAnsiChar(arg2));
end;

关于delphi - 用字符串从delphi调用c dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33375257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com