我用VC寫了一個DLL,Dll主要是把一個字符串,轉換一下。
同時我相在DELPHI中調用DLL中的一個函數C中函數的原形是int code(char *in ,char *out)這個是方由於in與out是指針所以是直接被改變了out的內容我在delphi下面寫了一個測試的程序,但是調用時總出錯!現在找大家幫我看一下錯在哪?unit dll;interface
type
Code=function( p,Comeout:Pchar ):Integer; stdcall;
/////////////////////////////////////////////////
//問1:這個地方的Code,要是我原來的C中的函數名嗎?
/////////////////////////////////////////////////
THandle=Integer;
implementationend.
unit maindll;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,dll;type
TForm1 = class(TForm)
Edit1: TEdit;
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
////////////////////////////////////////////////////////////////
//問2:由於C中的形參是字符串的指針,我這個地方的x,y實參可是以PChar嗎?
//////////////////////////////////////////////////////////////
x:pchar;
y:pchar;
Handle:THandle;
Code1:Code;
i:integer;
begin
Handle:=LoadLibrary('encode.dll');
if Handle <> 0 then
begin
/////////////////////////////
//問4:GetProcAddress(Handle,'Code');中Code也就是我C裏面的函數名對嗎?
/////////////////////////////
@Code1:=GetProcAddress(Handle,'Code');
if @code1 <> nil then
begin
////////////////////////////////
//這個地方顯示調用成功:
///////////////////////////////
ShowMessage('調用了Dll');
////////////////////////////////
//問5:我這樣寫一個字符串可以行嗎?
////////////////////////////////
x:='WRyiWnycUsau';
y:='';
/////////////////////////////////
//問6:下面這條語句出錯了,請問為什麼我這樣調用函數會出錯,為什麼?
//出現了DEBUG錯。
////////////////////////////////
Code1(x,y);
edit1.text:=y;
end //then
else
ShowMessage('调用函数“GetProcAddress”时出错!');
FreeLibrary(Handle);
end;
end;
請大家把我這幾個問題分析一下,然後幫助我解決這個問題!謝謝!
同時我相在DELPHI中調用DLL中的一個函數C中函數的原形是int code(char *in ,char *out)這個是方由於in與out是指針所以是直接被改變了out的內容我在delphi下面寫了一個測試的程序,但是調用時總出錯!現在找大家幫我看一下錯在哪?unit dll;interface
type
Code=function( p,Comeout:Pchar ):Integer; stdcall;
/////////////////////////////////////////////////
//問1:這個地方的Code,要是我原來的C中的函數名嗎?
/////////////////////////////////////////////////
THandle=Integer;
implementationend.
unit maindll;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,dll;type
TForm1 = class(TForm)
Edit1: TEdit;
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
////////////////////////////////////////////////////////////////
//問2:由於C中的形參是字符串的指針,我這個地方的x,y實參可是以PChar嗎?
//////////////////////////////////////////////////////////////
x:pchar;
y:pchar;
Handle:THandle;
Code1:Code;
i:integer;
begin
Handle:=LoadLibrary('encode.dll');
if Handle <> 0 then
begin
/////////////////////////////
//問4:GetProcAddress(Handle,'Code');中Code也就是我C裏面的函數名對嗎?
/////////////////////////////
@Code1:=GetProcAddress(Handle,'Code');
if @code1 <> nil then
begin
////////////////////////////////
//這個地方顯示調用成功:
///////////////////////////////
ShowMessage('調用了Dll');
////////////////////////////////
//問5:我這樣寫一個字符串可以行嗎?
////////////////////////////////
x:='WRyiWnycUsau';
y:='';
/////////////////////////////////
//問6:下面這條語句出錯了,請問為什麼我這樣調用函數會出錯,為什麼?
//出現了DEBUG錯。
////////////////////////////////
Code1(x,y);
edit1.text:=y;
end //then
else
ShowMessage('调用函数“GetProcAddress”时出错!');
FreeLibrary(Handle);
end;
end;
請大家把我這幾個問題分析一下,然後幫助我解決這個問題!謝謝!
解决方案 »
- argox条码打印机ppla指令函数说明
- 有一个问题,百思不得其解
- installshield DevStudio9 怎么做卸装程序
- 帮忙:DELPHI里面的鼠标右键弹出菜单,该怎么触发?
- 编写一个支持按shift键在DBGrid组件中批量选择记录的组件
- 连接远程sql server2000服务器所出现的几个问题
- 送出最后19分:老天爷呀!!安装连接数据库问题!是不是出妖怪了!!
- 如何用fastreport做一个动态报表??(高分相求)
- 关于金山公司的词霸那样的弹出菜单怎么做?
- 哪位大哥能解决expresssheet里如果公式里有中文会出现乱码的情况?
- 请教高手,如何利用listbox实现类似于memo的水平滚动条?
- 请问哪能下载到delphi7,本人初次接触delphi,谢谢帮助
//問2:由於C中的形參是字符串的指針,我這個地方的x,y實參可是以PChar嗎?---可以
//問4:GetProcAddress(Handle,'Code');中Code也就是我C裏面的函數名對嗎?---是的,注意大小写//問5:我這樣寫一個字符串可以行嗎?
////////////////////////////////
x:='WRyiWnycUsau';
y:='';
---不行,你必须为y分配足够的内存。例如:y := StrAlloc( 255 );然后再使用。