C++ Builder调用VC编写的DLL出现'Access violation at address xxx'的解决方法
Posted on 2010-04-16 15:14 Harry Huang 阅读(3584) 评论(0) 收藏 举报在使用C++ Builder的调用VC的DLL的时候遇到了'Access violation at address xxx'的错误,以下是测试程序:
C++ Builder代码:
//---------------------------------------------------------------------------
#include <stdio.h>
#include <windows.h>
#pragma hdrstop
//---------------------------------------------------------------------------
int __stdcall (*add)(int, int);
int __stdcall (*sub)(int, int);
#pragma argsused
int main(int argc, char* argv[])
{
HMODULE handle = LoadLibrary("AddFunc.dll");
add = GetProcAddress(handle, "Add");
sub = GetProcAddress(handle, "Sub");
printf("2+3=%d\n", add(2, 3));
printf("100-30=%d\n", sub(100, 30));
FreeLibrary(handle);
getchar();
return 0;
}
//---------------------------------------------------------------------------
DLL代码:
.h:
// The following ifdef block is the standard way of creating macros which make exporting // from a DLL simpler. All files within this DLL are compiled with the ADDFUNC_EXPORTS // symbol defined on the command line. this symbol should not be defined on any project // that uses this DLL. This way any other project whose source files include this file see // ADDFUNC_API functions as being imported from a DLL, whereas this DLL sees symbols // defined with this macro as being exported. #ifdef ADDFUNC_EXPORTS #define ADDFUNC_API extern "C" __declspec(dllexport) #else #define ADDFUNC_API extern "C" __declspec(dllimport) #endif ADDFUNC_API int Add(int a, int b); ADDFUNC_API int Sub(int a, int b);
.c:
// AddFunc.cpp : Defines the exported functions for the DLL application.
//
#include "stdafx.h"
#include "AddFunc.h"
ADDFUNC_API int Add(int a, int b)
{
return (a + b);
}
ADDFUNC_API int Sub(int a, int b)
{
return (a - b);
}
于是调用就出现了该异常,经过查阅资料得知VC的DLL在export的时候要加上__stdcall的修饰,强制使用WINAPI的导出方式,对两个函数修改为(.h, .c):
ADDFUNC_API int __stdcall Add(int a, int b); ADDFUNC_API int __stdcall Sub(int a, int b);
结果发现导出的函数发生了变化_Add@4, __Sub@4,解决方法是在VC工程中加入一个AddFunc.def,内容如下:
LIBRARY "AddFunc" EXPORTS Add @ 1 Sub @ 2
至此,解决问题。
作者:Harry Huang
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.
浙公网安备 33010602011771号