- PR -

VC++6.0で作られたDLLをVC++2005から呼び出し方

1
投稿者投稿内容
gen
会議室デビュー日: 2006/07/19
投稿数: 17
投稿日時: 2006-07-19 11:41
はじめまして、よろしくお願いします。

VC++6.0で作られたDLLをVC++2005から呼び出し方がわからなくて困っています。
VC++6.0で作られたDLLは別の会社から提供されたDLLでソースなどはありません。
あるのは
ノーマルなWin32 DLLファイル"hoge.dll",
インポートライブラリ"hoge.lib",
ヘッダファイル"hoge1.h"と"hoge2.h"
があります。

なかには
CPJConnectEx( HWND hWnd, int cpj_no, int rcv_evt_mode ) などの
複数の関数があるのでそれをVC++2005から呼び出して同じ関数で定義して.netのDLLを作成し、それをVB2005から参照して使おうとしています。

今はVC++2005のソリューションエクスプローラの"ヘッダー ファイル"フォルダに"hoge1.h"と"hoge2.h"を入れ、hoge.hファイルを新規作成し、以下のソースを書いてあります。
----------------------------------------------------------------------------
#pragma once

#import "C:\hoge\hoge.dll"

namespace Hoge {

public ref class clsHoge
{

//BOOL CPJConnectEx( int hWnd, int cpj_no, int rcv_evt_mode )
//{
//}
};
}
-----------------------------------------------------------------------------

"ソース ファイル"フォルダにはhoge.cppファイルを新規作成し、以下のソースが書いてあります。
---------------------------------------------------------------------------
// これは メイン DLL ファイルです。

#include "stdafx.h"

#include "hoge1.h"
#include "hoge2.h"

#include "hoge.h"
---------------------------------------------------------------------------
これでビルドすると以下のエラーが出ています。
---------------------------------------------------------------------------
エラー 1 fatal error C1083: タイプ ライブラリ ファイルを開けません。'c:\hoge\hoge.dll': タイプ ライブラリ/DLL の読み込みエラーです。 d:\visual studio 2005\hoge\hoge.h 5
---------------------------------------------------------------------------
この方法はだめですか?

参照元記事
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=26633&forum=7
・ロード時リンク(暗黙のリンク)
 この場合には、DLLとは別に、ヘッダファイル(.h)とインポートライブラリ(.lib)というものが必要です。
 ・ヘッダファイルには通常、DLLでエクスポートされている関数のプロトタイプ宣言が記述されています。
 ・インポートライブラリは、DLL作成時に同時に作成されるlibファイルです。
 DLLと共にこの2つのファイルが提供されていれば、
 ソースコード内でヘッダファイルをインクルードし
  #include "hoge.h"
 リンカにインポートライブラリ hoge.libを追加します。

プロジェクトのプロパティ画面でリンカの入力の追加依存ファイルには
hoge.lib $(NOINHERIT) のように設定しました。
この方法でもやってみましたけど関数の定義はどう定義すればいいでしょうか?

ほんとうによろしくお願いします、今週中に何とかならないと...
返事お待ちしております。


[ メッセージ編集済み 編集者: gen 編集日時 2006-07-19 11:44 ]
Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2006-07-19 11:56
とりあえず、手元にあるのが

〜.h と 〜.lib と 〜.dll

ならば、普通にリンクして使えると思います。

ソースだけで済ませるには

コード:

#include <〜.h>
#pragma comment( lib, "〜.lib" )


だけで使えるはず。(#importは不要。)
gen
会議室デビュー日: 2006/07/19
投稿数: 17
投稿日時: 2006-07-19 12:14
こんなに早く返事が来るとは思いませんでした、
ご返事ありがとうございます。
ご指摘のとおりにhoge.hファイルを以下のように改修入れました。
----------------------------------------------------------------------------
// KTcpJOINT.h

#include "hoge1.h"
#include "hoge2.h"

#pragma comment( lib, "C:\hoge\hoge.lib" )

namespace KTcpJOINT {

public ref class clsKTcpJOINT
{
BOOL CPJConnectEx( int hWnd, int cpj_no, int rcv_evt_mode )
{
}
};
}
-----------------------------------------------------------------------------

そうしたら行けそうな気がしますけど関数の定義のところでエラーが出ています。
---------------------------------------------------------------------------
エラー 4 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません d:\visual studio 2005\hoge\hoge.h 12
----------------------------------------------------------------------------


VC++6.0での定義:
CPJConnectEx( HWND hWnd, int cpj_no, int rcv_evt_mode ); になっています
VC++2005での定義:
BOOL CPJConnectEx( int hWnd, int cpj_no, int rcv_evt_mode )

やっぱり定義の仕方がまちがっているのでしょうか?
VC++2005で定義して.netのDLLを作成し、VB2005に参照して使いたいですが...

申し訳ないですがアドバイスお願いいたします。
Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2006-07-19 12:20
引用:

genさんの書き込み (2006-07-19 12:14) より:
VC++6.0での定義:
CPJConnectEx( HWND hWnd, int cpj_no, int rcv_evt_mode ); になっています
VC++2005での定義:
BOOL CPJConnectEx( int hWnd, int cpj_no, int rcv_evt_mode )


HWNDはIntPtrだったような気がします。

引用:

VC++2005で定義して.netのDLLを作成し、VB2005に参照して使いたいですが...


VC2005で作るのは、VC6のラッパークラスライブラリでしょうか?
Win32APIのように、VB2005からでも直接DLLの関数を使うことは可能です。
(DllImport(なんたら)という構文を使う)
gen
会議室デビュー日: 2006/07/19
投稿数: 17
投稿日時: 2006-07-19 12:31
引用:

VC2005で作るのは、VC6のラッパークラスライブラリでしょうか?
Win32APIのように、VB2005からでも直接DLLの関数を使うことは可能です。
(DllImport(なんたら)という構文を使う)



そうですね、最初は直接VB2005から使おうと思いましたがヘッターファイル中の
定義を全部VB2005に変えなければいけなっかたのと書き換えて本当にうまく動くのか
自信がなかったのとVC++2005だとヘッターファイルはそのまま使う(HWNDなどは
変えなければ行けないけど...)ことが可能だからです。ヘッターファイルを
みたらわけわからない定義がいっぱい書いてあったので手を入れるのが怖かっただけです。

ご返事ありがとうございます。
1

スキルアップ/キャリアアップ(JOB@IT)