1

私はDLLから関数を呼び出すのはまったく初めてです(プログラミングの悪い習慣と呼んでいますが、必要はありませんでした)。

次のシグネチャを持つ関数をエクスポートすることになっているこの C++ dll ( https://skydrive.live.com/redir?resid=4FA1892BF2106B62!1066の CidGen32.dll ) があります。

extern "C" __declspec(dllexport) int GetCid(const char* pid, char* cid); 

'1111111111118' のような 13 文字の文字列を取得し、20 文字のハッシュを返す必要があります。

ここ数日間、Delphi 6 でこの関数を呼び出そうとしましたが、役に立ちませんでした。50以上の組み合わせを必死に試しましたが、ある時はかなり接近しましたが、コンピューターがフリーズしてすべての努力を失いました。運次第だったので、もうやり直せませんでした。

また、DLL を登録するのではなく、同じフォルダーに配置することを目指しています。

とにかく、計画は次のようなものを持つことでした:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

  function GenerateCID(Prm: string): string;
  var
    aCID: PAnsiChar;
    uCID: AnsiString;
    i: integer;
    Hbar: Thandle;
    GetCID: function (X: PAnsiChar; Y: PAnsiChar): integer; {$IFDEF WIN32} stdcall; {$ENDIF}
  begin
    ucid := '';
    hbar := LoadLibrary('CidGen32.dll');
    if Hbar >= 32 then
    begin
      @GetCID := GetProcAddress(HBar, 'GetCID');
      if Assigned(GetCID) then
      begin
        i := GetCID(pAnsiChar(prm), aCID);
        uCID := aCID;
      end;
      FreeLibrary(HBar);
    end
    else
    begin
      //ShowMessage('Error: could not find dll');
    end;
    result := uCID;
  end;

begin
  ShowMessage(GenerateCID('1111111111118'));
end;

end.

しかし、私は完全に間違っているようです。

4

1 に答える 1

3

関数のインポートに間違った名前を使用しています。その名前はGetCidですが、インポートしようとしていますGetCID。に電話するときは、大文字と小文字が重要ですGetProcAddress。それでも呼び出しが成功しない場合は、GetProcAddressDependency Walker などのツールを使用して、関数がエクスポートされた名前を再確認してください。

関数は cdecl であるため、次のように宣言する必要があります。

GetCID: function(pid, cid: PAnsiChar): Integer; cdecl;

もう 1 つの問題は、cid の背後にバッファーを割り当てる責任があることです。あなたはそうしませんでした。次のようにします。

SetLength(uCID, 20);
i := GetCID(pAnsiChar(prm), pAnsiChar(uCID));

そして、aCID 変数を削除します。そして、その >32 エラー チェックは間違っています。0 と比較してください。

于 2013-07-10T20:57:22.643 に答える