我想调用Delphi XE5中的dll。
我花了一天左右谷歌搜索“从Delphi调用C DLL”,找到了很多页面,但都没有真正帮助我。
我已经收到了如何在VB中调用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在第一个参数中接收命令,并在第二个参数中返回结果文本。
以下是我生成的Delphi代码,试图调用DLL。我知道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;
SetLength
。而且不需要填充输出缓冲区。 - David Heffernan