> はぁ~。
う......orz
> typedef BOOL(WINAPI* *MYFUNC)(LPCTSTR lpFileName, ULONG ulFileType);
この宣言だと、MYFUNCは関数ポインタのポインタなので、
> ret = (*pFunc)(c:\\test.dat,0);
この呼び出し方自体は妥当だが、
> pFunc = (MYFUNC)GetProcAddress(hDLL,?add@xcvfdg); // 関数ポインタ取
GetProcAddressが返してくるのは、関数ポインタのポインタではなく関数ポインタなの
で、
この(無理な)キャストで参照数がずれ、結果として、関数の先頭コードをアドレスと見
て、
その位置を実行しようとしてしまい不正参照、というのが最初のエラー原因だと
思うのですが、何か間違ってましたでしょうか。
>> typedef BOOL(WINAPI* *MYFUNC)(LPCTSTR lpFileName, ULONG ulFileType);
>この宣言だと、MYFUNCは関数ポインタのポインタなので、
>> ret = (*pFunc)(c:\\test.dat,0);
>この呼び出し方自体は妥当だが、
あっ、すいません。
typedefの内容を詳しく見ていませんでしたorz。
単純にMYFUNCは関数ポインタだと認識していたので、
私の指摘は間違っていたかも知れません。
すいませんが、後は識者の方々、フォローをよろしくお願いします。
mmmさん、混乱させて申し訳ありませんでした。
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しか帰ってきません。
もう少しソースを見てどこか抜けている所とかないか確認してみます。
> ret = (*pFunc)(c:\\test.dat,0);
前述の通り、LPCTSTR に渡す文字列をリテラルで書く場合、TEXT or _T が囲む
必要があります。
# これは、UNICODEの扱いに関するWindows固有のルールです。
相手がUNICODEを期待している場合、文字列はUNICODEで渡してあげなければならない、
逆に相手がShiftJISなどを期待している場合、文字列はそのように渡してあげなければ
ならない、ということです。
文字コードが違うと、当然そのファイルを探すことはできません。
あと、大前提として、読み出しするデータの妥当性と、DLLの妥当性についても
考慮はしておいたほうがよいかと思います。
メーカの開発者がWindowsの作法に詳しくなくて、
LPCSTR でなく LPCTSTR なのは、サンプルにした他の関数にあわせただけで、
単に「Windowsではそう書くものだと思ってた」とかだと泣けます。
# そして、TCHARの認知度などを考えると、ありえない話ではない、かも...
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' : 定義されていない識別子です。とか
色々エラーが帰ってきました。
クラスを勉強していない私には無理でしょうか?
よろしくご指導の程よろしくお願いします。
// の後ろはただのコメントですね。
そのままでは通らないでしょう。
#固有の用法に関する質問は提供元のサポートに聞かれた方がよいのでは?
mmmです。
提供元のサポートに何とかお願いして聞いてみます。
大変そうですね。
VCなど、Cまたは、C++で作られたDLLならライブラリはないですか?
メーカ提供なら付属しているはずですよね。
なければ、提供してもらうとか出来ないですか。
ここまで大変なら、ライブラリをリンクしたほうが早いと思うのですが。
VB用でしたらすみません。
mmmです。
提供元のサポートに聞いて見た所、
開発言語:C#
ITOさん、レスありがとうございます。
ライブラリ自体はありましたのでリンクしています。
もしかして、ライブラリがあると解決するような
ヒントがあるのでしょうか。
よろしくご指導の程お願いします。
VC++用のライブラリが用意されているなら、静的リンクして、ヘッダファイルを
#includeするだけで使えませんか?
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# になるのしょうか?
らららのホームページや猫でもわかるプログラミングにも説明があります。
猫でもわかるプログラミングは、119章からきちんと見ましょう