[笔记]Delphi 2007写DLL供VC调用实例
考虑如下几种常用情况:
- VC传入int,返回int
- VC传入char *,返回int
- VC传入char *,返回char *及int
为简化问题,传递的字符串参数只考虑ANSI格式,不考虑UNICODE。
如果需要UNICODE,可以自行使用字符串格式转换函数。
Delphi 2007的代码如下:
library DemoDll; uses
SysUtils, Classes, Windows, StrUtils; {$R *.res} // Write to log file
procedure AddLog(const AFormat: string; Args: array of const); overload;
var
LogFile: TextFile;
FileName: string;
begin
FileName := GetEnvironmentVariable('TEMP') + '\DemoDll.log';
try
AssignFile(LogFile, FileName); if FileExists(FileName) then
Append(LogFile)
else
ReWrite(LogFile); Writeln(LogFile, Format('[%s] ', [DateTimeToStr(Now)]) + Format(AFormat, Args));
finally
CloseFile(LogFile);
end;
end; // Write to log file
procedure AddLog(const AFormat: string); overload;
begin
AddLog(AFormat, []);
end; // return a+b
function TestAdd(a, b: Integer): Integer; stdcall;
begin
AddLog('TestAdd(%d,%d)', [a, b]);
Result := a + b;
end; // do nothing, just log input string
function TestInputStr(PInStr: PChar): Integer; stdcall;
var
str: string;
begin
str := StrPas(PInStr);
AddLog('TestInputStr(%s)', [str]);
Result := 0;
end; // reverse first string and write to second string
function TestOutputStr(PInStr, POutStr: PChar): Integer; stdcall;
var
str: string;
begin
str := StrPas(PInStr);
str := ReverseString(str);
StrCopy(POutStr, PChar(str));
AddLog('TestOutputStr(%s)', [str]);
Result := 0;
end; exports
TestAdd,
TestInputStr,
TestOutputStr; begin
AddLog('BEGIN');
end.
VC2013的代码如下:
// Put DemoDll.dll in the same dir
// DemoDll.dll is developed by Delphi #include "windows.h"
#include <iostream> typedef int(__stdcall *fTestAdd)(int, int);
typedef int(__stdcall *fTestInputStr)(char *);
typedef int(__stdcall *fTestOutputStr)(char *, char *); using namespace std; int main(int argc, char* argv[])
{
HINSTANCE hDllLibrary = NULL; fTestAdd TestAdd = NULL;
fTestInputStr TestInputStr = NULL;
fTestOutputStr TestOutputStr = NULL; hDllLibrary = LoadLibraryA("DemoDll.dll");
if (hDllLibrary){
TestAdd = (fTestAdd)GetProcAddress(hDllLibrary, "TestAdd");
TestInputStr = (fTestInputStr)GetProcAddress(hDllLibrary, "TestInputStr");
TestOutputStr = (fTestOutputStr)GetProcAddress(hDllLibrary, "TestOutputStr"); // check if a == 3
int a = TestAdd(1, 2);
cout << "TestAdd(1,2)=" << a << endl; // check if input string has output to log file
char b[] = "nothing";
TestInputStr(b);
cout << "TestInputStr(" << b << ")" << endl; // check if output string is reversed
char c[] = "nothing";
char d[256] = { 0 };
TestOutputStr(c, d);
cout << "TestOutputStr(" << c << ")=" << d << endl;
} getchar();
return 0;
} // Console output:
//
// TestAdd(1, 2) = 3
// TestInputStr(nothing)
// TestOutputStr(nothing) = gnihton
//
// %Temp%/DemoDll.log
//[2017 / 6 / 4 14:48 : 46] BEGIN
//[2017 / 6 / 4 14:48 : 46] TestAdd(1, 2)
//[2017 / 6 / 4 14:48 : 46] TestInputStr(nothing)
//[2017 / 6 / 4 14:48 : 46] TestOutputStr(gnihton)
[笔记]Delphi 2007写DLL供VC调用实例的更多相关文章
- 用IKVMC将jar转成dll供c#调用
用IKVMC将jar转成dll供c#调用 ikvmc c# dll jar 用IKVMC将jar转成dll供c#调用 前言 ikvmc介绍 ikvmc下载安装 下载并解压 设置环境变量 jar-> ...
- Delphi 中的DLL 封装和调用对象技术(刘艺,有截图)
Delphi 中的DLL 封装和调用对象技术本文刊登2003 年10 月份出版的Dr.Dobb's 软件研发第3 期刘 艺摘 要DLL 是一种应用最为广泛的动态链接技术但是由于在DLL 中封装和调用对 ...
- Go 程序编译成 DLL 供 C# 调用。
Go 程序编译成 DLL 供 C# 调用. C# 结合 Golang 开发 1. 实现方式与语法形式 基本方式:将 Go 程序编译成 DLL 供 C# 调用. 1.1 Go代码 注意:代码中 ex ...
- Delphi XE3写DLL,用Delphi7调用,报错!
http://bbs.csdn.net/topics/390870532 用delphi xe3写的DLL,delphi7调用,参数都是PAnsiChar,DLL里的函数接收delphi7传的入参,没 ...
- Qt532_QWebView做成DLL供VC/Delphi使用_Bug
Qt5.3.2 vs2010 OpenGL ,VC6.0,Delphi7 1.自己继承 类QWebView,制作成DLL 供 VC6/Delphi7 使用 2.测试下来,DLL供VC6使用: 加载&q ...
- c++builder调用VC的dll以及VC调用c++builder的dll
解析__cdecl,__fastcall, __stdcall 的不同:在函数调用过程中,会使用堆栈,这三个表示不同的堆栈调用方式和释放方式. 比如说__cdecl,它是标准的c方法的堆栈调用方式,就 ...
- Delphi编写DLL供C#调用的实例
Delphi中编写的Dll: library TestDLL; { Important note about DLL memory management: ShareMem must be the f ...
- 可供VC调用的QT编写的界面DLL方法
一般直接编写的QT动态库是无法被Windows下的VC6.0等调用的. 如下步骤 第一步:必须要在QT界面库源码下包含qtwinmigrate的源码包和库,网上可下载到. 第二步:在QT的proc文件 ...
- Matlab函数编译成dll供c调用
一 编译dll 在Command Window窗口中输入mbuild -setup,然后会出现语句,是否安装编译器,选择n,因为机子上已经安装了C/C++/C#的编译器,选择VS2010.
随机推荐
- 【NOIP模拟题】“与”(位运算)
因为是与运算,所以我们可以贪心地每次找最高位的,将他们加入到新的序列中,然后每一次在这个新的序列继续找下一个位. 然后最后序列中任意两个的与运算的值都是一样的且是最大的. #include <c ...
- Windows远程访问OEM乱码解决
问题描述 发现用Windows访问Linux安装的Oracle时oem按钮总是乱码,整理解决方法如下: OEM简介及按钮乱码问题 http://www.linuxidc.com/Linux/2013 ...
- Python+selenium之简单介绍unittest单元测试框架
Python+selenium之简单介绍unittest单元测试框架 一.unittest简单介绍 unittest支持测试自动化,共享测试用例中的初始化和关闭退出代码,在unittest中最小单元是 ...
- galera安装之编译安装xtrabackup 2.2.11
----1.编译安装percona-xtrabackup yum -y install cmake gcc gcc-c++ libaio libaio-devel automake autoconf ...
- 当苹果因为UIDevice、udid、uniqueIdentifier而把我们的应用拒之门外invalid binary的时候,呕心沥血解决方法啊
本文转载至 http://blog.csdn.net/macmini/article/details/16341669 当我们辛辛苦苦把应用或者游戏做好的时候,满怀激动地把应用提交上去给苹果大大,谁知 ...
- 《C++ Primer Plus》第2章 开始学习C++ 学习笔记
C++程序由一个或多个被称为函数的模块组成.程序从main()函数(全部小写)开始执行,因此该函数必不可少.函数由函数头和函数体组成.函数头指出函数的返回值(如果有的话)的类型和函数期望通过参数传递给 ...
- Spring源码从开始到放弃(一)
参考<Spring技术内幕>分析. github上面有spring的源码(https://github.com/spring-projects/spring-framework) spri ...
- ex1. 二维数组中的查找
- html5文本超出部分用省略号表示
<p style="overflow:hidden; text-overflow:ellipsis;width:170px; white-space:nowrap; "> ...
- Struts2中的拦截器详解
exception:异常拦截器,拦截异常aliasservletConfig18nprepare:预备拦截器,这个拦截器就是为了ModelDriven准备对象的,若Action类实现了preparab ...