初心者です。はじめまして
お世話になります。
概要:C言語で作成したDLLをVBAで呼び出す。
タイトルの通り、C言語で作成したDLLをVBAで呼び出したいのですが、うまく
呼び出すことができず、「エラー番号:49 DLLを正しく呼び出せません。」
というエラーが返ってきてしまいます。
DLLの作成手順もしくはDLLの呼び出し方でおかしな所があればご指摘頂けない
でしょうか?
C言語のDLL、作成手順は以下の通りです。
DLL作成環境:Visual C++ 6.0
DLL作成手順-----------------------------------------
(1)プロジェクトをDLL用に作る
新規作成→プロジェクト→Win32 Dynamic-Link Library→空のDLLプロジェ
クト
(2)ファイル追加
ソースファイル+すべてのヘッダファイルを追加
(3)DLLを出力対象の関数に「_declspec(dllexport)」をつける
例)-------------------------------------
_declspec(dllexport) short dlltest
(char *str1,
char *str2)
---------------------------------------
(4)char を unsigned char へ変換する(/J コンパイルオプション)
(5)プロジェクトをデバッグモードからリリースモードに切り替える
(6)ビルド実行
(7)「Release」配下に.dllとlibができる。
-作成手順完-----------------------------------------------------
実際のVBAのDLLの呼び出しは以下の通り行っています。
-AccessVBAにてDLLの宣言及び、呼び出し-------------------
'呼び出し宣言
Public Declare Function dlltest _
Lib "C:\Project\Dlltest\Release\dlltest.dll" _
(ByVal st1 As String, _
ByVal st2 As String) As Integer
'DLL呼び出し
KEKKA = dlltest(string1, string2)
-呼び出し完------------------------------------------------
これで実行するとエラーが返されていまいます。
なにぶん、初心者で今回初めてVBAでのプログラミングを行っているので観点
の抜けなどが多分にあると思われます。
どんな小さなことでもご指摘頂けないでしょうか?
宜しくお願い致します。
No.1ベストアンサー
- 回答日時:
VC側ですが 呼び出し規約を変更しないといけません
また C++(cpp)拡張子で組んであるなら extern "C"でくくるなどのひつっようがあります
外部公開用の名前が _関数名@引数のバイト数といった変換がなされるので Access側で Aliasを使って整合を取るか DEFファイルによるエクスポート名を指定しましょう
これらを踏まえて
DLL側は
short __declspec( dllexport ) __stdcall dlltest( char* str1, char * str2 )
といった具合にします
CPPファイルなら
extern "C" { // これを使って CPP命名規則を抑止します
short __declspec( dllexport ) __stdcall dlltest( char* str1, char * str2 )
{
// 関数本体
}
}
DEFファイルは
LIBRARY DLLファイル名
EXPORTS
dlltest
といった具合です
# DLLファイル名は適宜修正してください
redfox63様
動きました!!!本当にありがとうございます。
私の場合はC++ではなくCで作成したものでしたのでアドバイスの通り
short __declspec( dllexport ) __stdcall dlltest( char* str1, char * str2 )
と記述し、DEFファイルを作成しただけで動きました。
ググってもほとんど明確な答えになるものがなかったので本当に助かりました^^
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コンパイルするときに、ファイ...
-
windows Visual C++6.0を利用...
-
ACCESSのEXEを作るのは可能...
-
VB.NETで他のプロジェクトで作...
-
関数がDLLファイル内に見つかり...
-
.dllと.exeファイルの改良について
-
「マージする」とは?
-
プリコンパイル?
-
OpenSSLのPEMファイル入出力時...
-
エラーの原因は?「この関数の...
-
libssh2のインクルード
-
VB6.0 オブジェクトを一覧で表示
-
EXEをつくるとレジストリが...
-
C#でWin32 MFC DLLが呼び出せない
-
stdio.hをオープンできない…
-
VisualStudio C++ 2008で最初か...
-
.net2002のアプリを2003、2005...
-
VisualBasicを保存するときにで...
-
複数のCのみファイルをリンクし...
-
Visual Stadio2008 Releaseビル...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NETで他のプロジェクトで作...
-
ACCESSのEXEを作るのは可能...
-
ソースから参照しているOCXの一...
-
エラーの原因は?「この関数の...
-
VB6で、非表示モジュール(?)の...
-
コンパイルするときに、ファイ...
-
C#のクラスをVB.netで使用したい!
-
VB.NETでActiveX(OCXファイル)作成
-
VC++でexeファイルが作成できま...
-
同じソースコードなのにバイナ...
-
VS2010 ProductVersion 変更
-
プリコンパイル?
-
VC++ 2005 Intellisenseを更新....
-
他の.CPPファイルに定義した関...
-
Visual Stadio2008 Releaseビル...
-
Visual Studioを使ったフォーム...
-
【C#】exeファイルに複数アイコ...
-
VB6 exeファイルのプロパティの...
-
コンパイルエラー「include フ...
-
関数がDLLファイル内に見つかり...
おすすめ情報