gpt4 book ai didi

delphi - 如何使用 DELPHI 中用 C 编写的外部 DLL

转载 作者:行者123 更新时间:2023-12-03 15:43:55 26 4
gpt4 key购买 nike

我需要使用外部 dll 与数码相机通信,我找到了具有适当 dll 的程序来实现通信。在 dll 描述中,我找到了适合我需要的函数。 DLL 头看起来像这样......

//-------------------------------------------------------------------
// ReleaseShutter()
// Inputs:
// timeOutInSecs timeout in secs to wait for picture to be
// taken and downloaded (max 60 secs)
// pszFilename option string in which to store the name of the
// saved image. Set to NULL if not required
// numChars length of pszFilename if defined
//
// Returns:// 0 - Success, image saved
// 1 - PSRemote is not running
// 2 - PSRemote is running but camera is not connected
// 3 - Camera is busy
// 4 - Timeout waiting for image to be saved
// 5 - Error releasing shutter
//
// Description:
// Take a picture and optionally wait for it to be saved to disk.
//
//--------------------------------------------------------------------
PSRemoteLIB_API int __stdcall ReleaseShutter( int timeoutInSecs,
char* Filename,int numChars );

好吧,我加载 dll,使用函数,获取结果状态,外部程序拍照,但我无法获取文件名!!!!这是我的代码

procedure TForm1.Button2Click(Sender: TObject);
var Status: Integer;
Name1: PChar;
DLLHandle: Thandle;
TakePic: Function (T: Integer; Nam: Pchar;Num:Integer):Integer; {$IFDEF WIN32} stdcall; {$ENDIF}

begin DLLHandle := LoadLibrary('PSRemoteLib.dll');
if DLLHandle >= 32 then { success }
begin
Name1:=stralloc(1024);
TakePic := GetProcAddress(DLLHandle, 'ReleaseShutter');
Status:=TakePic(60,Name1,SizeOf(Name1));
label1.Caption:=intTostr(Status);
label2.Caption:=Name1;
FreeLibrary(DLLHandle);
end
else MessageDlg('Error: could not find PSRemoteLib.dll', mtError, [mbOk], 0);
StrDispose(Name1);
end;

我尝试了 PChar PWidechar 以及我在网上找到的所有内容,但什么也没有!!!

我做错了什么???在 dll 附带并在 cmd 模式下运行的示例 .exe 中,这工作正常!程序拍摄图片并报告文件名???我有一个示例源代码,看起来像这样

        case 0: // success            if (filename && strlen(filename))            
{
cout << "Success, image saved as: " << filename << endl;
}
else
{
cout << "Success, image saved on CF card?" << endl;
}
break;
case 1: cerr << "PSRemote is not running" << endl;
break;
case 2: cerr << "Camera is not connected" << endl;
break;
case 3: cerr << "Camera is busy" << endl;
break;
case 4: cerr << "Timeout waiting for image to be saved" << endl;
break;
default:
cerr << "ERROR: unexpected return status: " << status << endl;
}

}
return nRetCode;
}

请帮助我需要这个!!!

PS也在dll中我有类似的功能

{///----------------------------------------------------------------------- }
{/// GetOutputPath() }
{/// Inputs: }
{/// pszPathname string in which to store the pathname of the }
{/// directory currently being used to save images }
{/// numChars length of pszPathname }
{/// }
{/// Returns: }
{/// 0 - Success, pathname returned in pszPathname }
{/// 1 - PSRemote is not running }
{/// 4 - Some other error }
{/// }
{/// Description: }
{/// Returns the full pathname of the directory used for saving images. }
{/// This is the base directory as specified by SetOutputPath() plus }
{/// any separate directories for year, month or day if selected in }
{/// preferences. }
{/// }
{///----------------------------------------------------------------------- }
var
GetOutputPath: function(pszPathname: PChar;
numChars: var Integer): SREMOTELIB_API INT __STDCALL cdecl {$IFDEF WIN32} stdcall {$ENDIF};

再次获取状态(整数),但不返回路径名??????

最佳答案

该函数想要获取一个字符缓冲区。这意味着您必须像这样分配

Name1 : array[MAX_PATH+1] of AnsiChar;

MAX_PATH 是在 Windows 单元中定义的,并且应该足够大。 AnsiChar 对于所有 Delphi 版本来说相当于 C++ char

在调用中,您必须设置指向缓冲区的指针和最大字符数

Status := TakePic(60,Name1,MAX_PATH);

关于delphi - 如何使用 DELPHI 中用 C 编写的外部 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5860559/

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