DLLのインポートについて – 固定ページ 2 – プログラミング – Home

DLLのインポートについて
 
通知
すべてクリア

DLLのインポートについて

固定ページ 2 / 2

Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

> はぁ~。

う......orz

> typedef BOOL(WINAPI* *MYFUNC)(LPCTSTR lpFileName, ULONG ulFileType);
この宣言だと、MYFUNCは関数ポインタのポインタなので、
> ret = (*pFunc)(c:\\test.dat,0);
この呼び出し方自体は妥当だが、
> pFunc = (MYFUNC)GetProcAddress(hDLL,?add@xcvfdg); // 関数ポインタ取
GetProcAddressが返してくるのは、関数ポインタのポインタではなく関数ポインタなの
で、
この(無理な)キャストで参照数がずれ、結果として、関数の先頭コードをアドレスと見
て、
その位置を実行しようとしてしまい不正参照、というのが最初のエラー原因だと
思うのですが、何か間違ってましたでしょうか。


返信引用
KING・王
 KING・王
(@KING・王)
ゲスト
結合: 20年前
投稿: 122
 

>> typedef BOOL(WINAPI* *MYFUNC)(LPCTSTR lpFileName, ULONG ulFileType);
>この宣言だと、MYFUNCは関数ポインタのポインタなので、
>> ret = (*pFunc)(c:\\test.dat,0);
>この呼び出し方自体は妥当だが、

あっ、すいません。
typedefの内容を詳しく見ていませんでしたorz。
単純にMYFUNCは関数ポインタだと認識していたので、
私の指摘は間違っていたかも知れません。

すいませんが、後は識者の方々、フォローをよろしくお願いします。

mmmさん、混乱させて申し訳ありませんでした。


返信引用
mmm
 mmm
(@mmm)
ゲスト
結合: 19年前
投稿: 10
Topic starter  

Blueさん・Banさん・KING・王さん、レスありがとうございます。
突然、VCがロックしてビルドの中止押しても、復帰しなくなったので
色々調べていたら、VCのSP6を当てたら復旧しました。

Banさんのご指摘どおり
typedef BOOL(WINAPI* *MYFUNC)(LPCTSTR lpFileName, ULONG ulFileType);
をtypedef BOOL(WINAPI *MYFUNC)(LPCTSTR lpFileName, ULONG ulFileType);に
変更したら、実行後エラーは無くなりました。

ret = (*pFunc)(c:\\test.dat,0);
switch( ret ){
case FALSE: MessageBox(NULL,FALSE,メッセージ,MB_OK);break;
case TRUE: MessageBox(NULL,TRUE,メッセージ,MB_OK);break;
}
で確認してもFALSEしか帰ってきません。
もう少しソースを見てどこか抜けている所とかないか確認してみます。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

> ret = (*pFunc)(c:\\test.dat,0);

前述の通り、LPCTSTR に渡す文字列をリテラルで書く場合、TEXT or _T が囲む
必要があります。
# これは、UNICODEの扱いに関するWindows固有のルールです。

相手がUNICODEを期待している場合、文字列はUNICODEで渡してあげなければならない、
逆に相手がShiftJISなどを期待している場合、文字列はそのように渡してあげなければ
ならない、ということです。
文字コードが違うと、当然そのファイルを探すことはできません。

あと、大前提として、読み出しするデータの妥当性と、DLLの妥当性についても
考慮はしておいたほうがよいかと思います。

メーカの開発者がWindowsの作法に詳しくなくて、
LPCSTR でなく LPCTSTR なのは、サンプルにした他の関数にあわせただけで、
単に「Windowsではそう書くものだと思ってた」とかだと泣けます。
# そして、TCHARの認知度などを考えると、ありえない話ではない、かも...


返信引用
mmm
 mmm
(@mmm)
ゲスト
結合: 19年前
投稿: 10
Topic starter  

mmmです。DATAFILE.h の最後を見てみたら
以下の様に書いてありました。

//// This class is exported from the DataFileIo.dll
//class DATAFILEIO_API DataFileIo {
//public:
// DataFileIo(void);
// // TODO: add your methods here.
//};

//extern DATAFILEIO_API int nDataFileIo;
//
//DATAFILEIO_API int fnDataFileIo(void);

これは、やっぱりクラスで渡すから、クラスで受け取れと
言う事でしょうか?
ちなみに新たに

dllCall.cpp
#include DATAFILE.h

void main()
{
DataFileIo my;
my.OpenData(LPCTSTR lpFileName, ULONG ulFileType);

}
としてコンパイルしたら
error C2065: 'DataFileIo' : 定義されていない識別子です。とか
色々エラーが帰ってきました。
クラスを勉強していない私には無理でしょうか?

よろしくご指導の程よろしくお願いします。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

// の後ろはただのコメントですね。
そのままでは通らないでしょう。
#固有の用法に関する質問は提供元のサポートに聞かれた方がよいのでは?


返信引用
mmm
 mmm
(@mmm)
ゲスト
結合: 19年前
投稿: 10
Topic starter  

mmmです。
提供元のサポートに何とかお願いして聞いてみます。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

大変そうですね。
VCなど、Cまたは、C++で作られたDLLならライブラリはないですか?
メーカ提供なら付属しているはずですよね。
なければ、提供してもらうとか出来ないですか。
ここまで大変なら、ライブラリをリンクしたほうが早いと思うのですが。
VB用でしたらすみません。


返信引用
mmm
 mmm
(@mmm)
ゲスト
結合: 19年前
投稿: 10
Topic starter  

mmmです。
提供元のサポートに聞いて見た所、

開発言語:C#

ITOさん、レスありがとうございます。
ライブラリ自体はありましたのでリンクしています。

もしかして、ライブラリがあると解決するような
ヒントがあるのでしょうか。

よろしくご指導の程お願いします。


返信引用
RAPT
 RAPT
(@RAPT)
ゲスト
結合: 22年前
投稿: 310
 

VC++用のライブラリが用意されているなら、静的リンクして、ヘッダファイルを
#includeするだけで使えませんか?


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

libファイルをつかいDLLとリンクと仕方と
LoadLibrary関数を使いDLLとリンクする方法はそれぞ違いがあります。
(作業としてはlibファイルでリンクするほうが格段に楽ちん)

関連スレ
DLL 暗黙的リンク 明示的リンク の差異
http://www.vcppclub.com/bbs1/wforum.cgi?
mode=allread&pastlog=0004&no=2522&page=20&act=past#2522

> 開発言語:C#
とは?なにが C# になるのしょうか?


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

らららのホームページや猫でもわかるプログラミングにも説明があります。
猫でもわかるプログラミングは、119章からきちんと見ましょう


返信引用
固定ページ 2 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました